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格式)
openssl genrsa -traditional -out server.key 2048
- 关键参数:
-traditional
:强制生成传统格式的RSA私钥(以-----BEGIN RSA PRIVATE KEY-----
开头)。
2048
:RSA密钥长度(推荐安全强度)。 - 输出文件:
server.key
(私钥文件)。
2. 创建证书签名请求(CSR)
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文件)
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----- |
🔍 验证文件格式
# 检查私钥格式(确认包含 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,参考以下配置片段:
ssl_certificate /path/to/server.pem; ssl_certificate_key /path/to/server.key;
- Kubernetes TLS Secret可通过命令创建:
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
[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私钥(传统格式)
openssl genrsa -traditional -out server.key 2048
3. 生成CSR(集成SAN扩展)
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)
openssl x509 -req -days 365 \-in server.csr \-signkey server.key \-out server.pem \-extfile ext.cnf \ # 关键:注入SAN-extensions v3_req
✅ 验证SAN配置
openssl x509 -in server.pem -text -noout | grep -A1 "Subject Alternative Name"
输出应包含:
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 | grep "IP Address" |
由小艺AI生成<xiaoyi.huawei.com>
3、还是报错啊, 证书解析错误 DNSNames
您遇到的 “证书解析错误 DNSNames” 问题通常是因为证书的 Subject Alternative Name (SAN) 扩展中缺少 DNS 格式的标识(即使您使用 IP 访问)。以下是终极解决方案:
🔧 关键修复步骤(同时添加 IP 和 DNS 格式的 SAN)
1. 修改 SAN 配置文件 ext.cnf
[alt_names]
# 必须同时声明 IP 和 DNS 格式
IP.1 = 10.11.111.11 # IP 地址格式
DNS.1 = 10.11.111.11 # DNS 格式(解决 DNSNames 错误的核心)
2. 重新生成证书(复用私钥)
# 生成新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
✅ 双重验证命令
openssl x509 -in server_new.pem -text -noout | grep -A 2 "Subject Alternative Name"
正确输出应包含:
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)仍要求证书包含
-
浏览器兼容性差异
-
证书部署后清理
# 重启 web 服务前清除旧证书缓存 sudo systemctl stop nginx sudo rm /var/lib/nginx/ssl_session_cache/* sudo systemctl start nginx
🛠️ 终极验证方案
-
OpenSSL 客户端测试:
openssl s_client -connect 10.11.111.11:443 -servername 10.11.111.11 | grep "DNS:"
输出必须包含:
DNS:10.11.111.11
-
浏览器强制刷新:
Chrome 中执行Ctrl+Shift+R
(忽略缓存重载) -
跨平台验证工具:
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 2048openssl 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