openssl 自签证书生成步骤

问题:openssl 自签证书生成步骤,使用rsa ,需要服务器端 pem和key文件, 针对服务器ip http://10.11.111.11/

要求私钥为 -----BEGIN RSA PRIVATE KEY----- 格式

以下是针对服务器IP 10.11.111.11 生成自签名证书的完整步骤(使用RSA算法),确保私钥为传统PEM格式(-----BEGIN RSA PRIVATE KEY-----),并生成服务器端所需的.pem(证书)和.key(私钥)文件:


📝 生成步骤

1. 生成RSA私钥(传统PEM格式)

bash 复制代码
openssl genrsa -traditional -out server.key 2048
  • 关键参数
    -traditional:强制生成传统格式的RSA私钥(以-----BEGIN RSA PRIVATE KEY-----开头)。
    2048:RSA密钥长度(推荐安全强度)。
  • 输出文件server.key(私钥文件)。
2. 创建证书签名请求(CSR)
bash 复制代码
openssl req -new -key server.key -out server.csr -subj "/CN=10.11.111.11"
  • 关键参数
    -subj:直接指定主题信息,避免交互式输入。/CN=10.11.111.11 将IP设为通用名称(必须与访问地址一致,否则浏览器报错)。
  • 输出文件server.csr(证书请求文件)。
3. 生成自签名证书(.pem文件)
bash 复制代码
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.pem
  • 关键参数
    -days 365:证书有效期(1年)。
    -signkey server.key:用私钥直接签名,生成自签名证书。
  • 输出文件server.pem(证书文件,PEM格式)。

最终生成文件

文件 用途 格式要求
server.key 服务器私钥 -----BEGIN RSA PRIVATE KEY-----
server.pem 服务器证书(含公钥) -----BEGIN CERTIFICATE-----

🔍 验证文件格式

bash 复制代码
# 检查私钥格式(确认包含 BEGIN RSA PRIVATE KEY)
head -n 1 server.key

# 查看证书信息(确认IP在CN字段)
openssl x509 -in server.pem -text -noout | grep "CN="
  • 私钥首行应为 -----BEGIN RSA PRIVATE KEY-----
  • 证书的 Subject: CN = 10.11.111.11 需与IP一致。

⚠️ 注意事项

  1. 浏览器警告:自签名证书会被浏览器标记为"不安全",需手动信任(仅适用于测试/内网)。

  2. 私钥安全server.key 必须严格保密,泄露会导致安全风险。

  3. 扩展用途

    • 若需配置Nginx,参考以下配置片段:
    nginx 复制代码
    ssl_certificate     /path/to/server.pem;
    ssl_certificate_key /path/to/server.key;
    • Kubernetes TLS Secret可通过命令创建:
    bash 复制代码
    kubectl create secret tls my-tls-secret --cert=server.pem --key=server.key

由小艺AI生成<xiaoyi.huawei.com>

2、证书解析错误 DNSNames

根据您遇到的"证书解析错误 DNSNames"问题,这是由于现代浏览器(如Chrome)强制要求证书包含Subject Alternative Name(SAN)扩展字段导致的。以下是修复后的完整解决方案:


🔧 修复步骤(添加SAN扩展)

1. 创建SAN配置文件 ext.cnf
ini 复制代码
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = CN
stateOrProvinceName = State
localityName = City
organizationName = Organization
commonName = 10.11.111.11  # 必须与访问IP一致

[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names  # 关键SAN配置

[alt_names]
IP.1 = 10.11.111.11  # 声明IP为SAN
2. 生成RSA私钥(传统格式)
bash 复制代码
openssl genrsa -traditional -out server.key 2048
3. 生成CSR(集成SAN扩展)
bash 复制代码
openssl req -new -key server.key -out server.csr \
  -subj "/CN=10.11.111.11" \  # 通用名称设为IP
  -config ext.cnf \           # 加载SAN配置
  -extensions v3_req          # 启用扩展段
4. 生成自签名证书(含SAN)
bash 复制代码
openssl x509 -req -days 365 \
  -in server.csr \
  -signkey server.key \
  -out server.pem \
  -extfile ext.cnf \          # 关键:注入SAN
  -extensions v3_req

✅ 验证SAN配置

bash 复制代码
openssl x509 -in server.pem -text -noout | grep -A1 "Subject Alternative Name"

输出应包含:

text 复制代码
X509v3 Subject Alternative Name: 
    IP Address:10.11.111.11

⚠️ 关键修复点说明

  1. SAN扩展必要性

    现代浏览器已弃用CN字段校验 ,强制要求证书包含subjectAltName扩展字段。未配置SAN会导致ERR_CERT_COMMON_NAME_INVALID错误。

  2. IP地址的特殊处理

    • SAN中必须显式声明IP地址(IP.1 = 10.11.111.11
    • CN字段仍需设置为IP(双重兼容性保障)
  3. 私钥格式保障

    使用-traditional参数确保私钥为传统PEM格式(-----BEGIN RSA PRIVATE KEY-----


📦 最终文件清单

文件 用途 格式验证
server.key RSA私钥 head -1 server.key-----BEGIN RSA PRIVATE KEY-----
server.pem 证书 `openssl x509 -in server.pem -text

由小艺AI生成<xiaoyi.huawei.com>

3、还是报错啊, 证书解析错误 DNSNames

您遇到的 "证书解析错误 DNSNames" 问题通常是因为证书的 Subject Alternative Name (SAN) 扩展中缺少 DNS 格式的标识(即使您使用 IP 访问)。以下是终极解决方案:


🔧 关键修复步骤(同时添加 IP 和 DNS 格式的 SAN)

1. 修改 SAN 配置文件 ext.cnf
ini 复制代码
[alt_names]
# 必须同时声明 IP 和 DNS 格式
IP.1 = 10.11.111.11      # IP 地址格式
DNS.1 = 10.11.111.11     # DNS 格式(解决 DNSNames 错误的核心)
2. 重新生成证书(复用私钥)
bash 复制代码
# 生成新CSR(含双重SAN)
openssl req -new -key server.key -out server_new.csr \
  -subj "/CN=10.11.111.11" \
  -config ext.cnf -extensions v3_req

# 生成新证书(注入双重SAN)
openssl x509 -req -days 365 \
  -in server_new.csr \
  -signkey server.key \
  -out server_new.pem \
  -extfile ext.cnf -extensions v3_req

✅ 双重验证命令

bash 复制代码
openssl x509 -in server_new.pem -text -noout | grep -A 2 "Subject Alternative Name"

正确输出应包含:

text 复制代码
X509v3 Subject Alternative Name: 
 IP Address:10.11.111.11,
    DNS:10.11.111.11     # ← 这是解决 DNSNames 错误的关键

⚠️ 问题根源解析

错误类型 原因 解决方案
ERR_CERT_COMMON_NAME_INVALID 现代浏览器忽略 CN 字段 添加 SAN 的 IP 地址项
证书解析错误 DNSNames SAN 中缺少 DNS 格式标识 同时添加 IP.xDNS.x
私钥格式错误 非标准 PEM 格式 -traditional 生成 RSA 密钥

📌 必须注意的细节

  1. DNS 格式 SAN 是强制要求

    • 即使访问的是 IP,某些环境(如 Java/Node.js)仍要求证书包含 DNS: 条目
    • 未配置时触发错误:Certificate does not contain any DNS SANs
  2. 浏览器兼容性差异

    Chrome/Edge 接受纯IP格式SAN Firefox/Safari Java应用 要求DNS格式SAN 报错 Node.js应用

  3. 证书部署后清理

    bash 复制代码
    # 重启 web 服务前清除旧证书缓存
    sudo systemctl stop nginx
    sudo rm /var/lib/nginx/ssl_session_cache/*
    sudo systemctl start nginx

🛠️ 终极验证方案

  1. OpenSSL 客户端测试

    bash 复制代码
    openssl s_client -connect 10.11.111.11:443 -servername 10.11.111.11 | grep "DNS:"

    输出必须包含:
    DNS:10.11.111.11

  2. 浏览器强制刷新

    Chrome 中执行 Ctrl+Shift+R(忽略缓存重载)

  3. 跨平台验证工具

    bash 复制代码
    curl -vk --resolve 10.11.111.11:443:127.0.0.1 

    检查输出中 * SSL certificate verify ok.

由小艺AI生成<xiaoyi.huawei.com>

4、总结

命令

复制代码
openssl genrsa -traditional -out server.key 2048

openssl req -new -key server.key -out server.csr -subj "/CN=10.11.111.11"  -config ext.cnf  -extensions v3_req 

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.pem -extfile ext.cnf -extensions v3_req

ext.cnf文件

复制代码
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = CN
stateOrProvinceName = State
localityName = City
organizationName = Organization
commonName = 10.11.111.11  # 必须与访问IP一致

[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names  # 关键SAN配置

[alt_names]
# 必须同时声明 IP 和 DNS 格式
IP.1 = 10.11.111.11      # IP 地址格式
DNS.1 = 10.11.111.11     # DNS 格式(解决 DNSNames 错误的核心)

参考https://blog.csdn.net/weixin_44323744/article/details/144242987

相关推荐
夜空晚星灿烂24 分钟前
C# 网络编程-关于HTTP/HTTPS的基础(一)
网络协议·http·https
2501_915921434 小时前
使用Charles抓包工具提升API调试与性能优化效率
websocket·网络协议·tcp/ip·http·网络安全·https·udp
兴达易控5 小时前
汇川IS620N伺服驱动器如何通过etherCAT主站转profinet网关与西门子1200plc通讯
网络协议
听风lighting11 小时前
WevServer实现:异步日志写与HTTP连接
linux·网络·c++·网络协议·http·秋招·嵌入式面试
三体世界20 小时前
HTTPS加密原理
linux·开发语言·网络·c++·网络协议·http·https
zhaoll98k20 小时前
HTTP Server
网络·网络协议·http
刘俊辉个人博客1 天前
Agile Controller实现AAA示例
运维·网络·网络协议·tcp/ip·计算机网络·网络安全
靡樊1 天前
传输层协议UDP/TCP
linux·网络·网络协议·学习·tcp/ip·udp
兴达易控1 天前
信捷V5 - F5变频器接入到Profibus网络的关键
网络协议