问题: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一致。 
⚠️ 注意事项
- 
浏览器警告:自签名证书会被浏览器标记为"不安全",需手动信任(仅适用于测试/内网)。
 - 
私钥安全 :
server.key必须严格保密,泄露会导致安全风险。 - 
扩展用途 :
- 若需配置Nginx,参考以下配置片段:
 
nginxssl_certificate /path/to/server.pem; ssl_certificate_key /path/to/server.key;- Kubernetes TLS Secret可通过命令创建:
 
bashkubectl 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
        ⚠️ 关键修复点说明
- 
SAN扩展必要性
现代浏览器已弃用CN字段校验 ,强制要求证书包含
subjectAltName扩展字段。未配置SAN会导致ERR_CERT_COMMON_NAME_INVALID错误。 - 
IP地址的特殊处理
- SAN中必须显式声明IP地址(
IP.1 = 10.11.111.11) - CN字段仍需设置为IP(双重兼容性保障)
 
 - SAN中必须显式声明IP地址(
 - 
私钥格式保障
使用
-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.x 和 DNS.x | 
| 私钥格式错误 | 非标准 PEM 格式 | 用 -traditional 生成 RSA 密钥 | 
📌 必须注意的细节
- 
DNS 格式 SAN 是强制要求
- 即使访问的是 IP,某些环境(如 Java/Node.js)仍要求证书包含 
DNS:条目 - 未配置时触发错误:
Certificate does not contain any DNS SANs 
 - 即使访问的是 IP,某些环境(如 Java/Node.js)仍要求证书包含 
 - 
浏览器兼容性差异
Chrome/Edge 接受纯IP格式SAN Firefox/Safari Java应用 要求DNS格式SAN 报错 Node.js应用
 - 
证书部署后清理
bash# 重启 web 服务前清除旧证书缓存 sudo systemctl stop nginx sudo rm /var/lib/nginx/ssl_session_cache/* sudo systemctl start nginx 
🛠️ 终极验证方案
- 
OpenSSL 客户端测试:
bashopenssl s_client -connect 10.11.111.11:443 -servername 10.11.111.11 | grep "DNS:"输出必须包含:
DNS:10.11.111.11 - 
浏览器强制刷新 :
Chrome 中执行
Ctrl+Shift+R(忽略缓存重载) - 
跨平台验证工具:
bashcurl -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