OpenSSL创建链式证书遇证书无效错误及SubjectAltName添加问题
解决OpenSSL 1.0.1g服务器证书添加Subject Alternative Name的问题
OpenSSL 1.0.1g对证书扩展的处理比较死板——必须显式关联配置段,光修改配置文件不指定对应段的话,扩展根本不会生效。下面是针对你的三级证书链场景的具体解决步骤:
1. 修正配置文件的扩展定义
不管是生成服务器CSR的配置,还是中间CA签名用的配置,都要明确扩展段:
服务器CSR配置(比如openssl-server.cnf)
[ req ] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = v3_req # 生成CSR时就把扩展嵌进去 [ req_distinguished_name ] # 保留你原来的DN配置,比如国家、组织、CN等 commonName = your-server-domain.com [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [ alt_names ] DNS.1 = your-server-domain.com DNS.2 = sub.your-server-domain.com IP.1 = 192.168.1.100 # 有需要就加IP地址
中间CA签名配置(比如openssl-intermediate.cnf)
必须确保中间CA允许签发带扩展的服务器证书:
[ ca ] default_ca = CA_default [ CA_default ] # 保留你原来的CA配置(比如证书路径、数据库等) policy = policy_anything x509_extensions = server_cert # 指定签服务器证书用的扩展段 [ policy_anything ] # 允许DN字段灵活匹配,根据你的需求调整 countryName = optional stateOrProvinceName = optional commonName = supplied [ server_cert ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names # 引用SAN段 [ alt_names ] # 和服务器CSR里的SAN保持一致,或者按需调整 DNS.1 = your-server-domain.com DNS.2 = sub.your-server-domain.com IP.1 = 192.168.1.100
2. 重新生成服务器CSR
用修改后的配置生成CSR,确保扩展被包含:
openssl req -new -key server.key -out server.csr -config openssl-server.cnf
验证CSR是否带SAN:
openssl req -text -noout -in server.csr
输出里找X509v3 Subject Alternative Name,确认存在且内容正确。
3. 用中间CA签名时必须指定扩展段
这是最容易踩坑的地方!OpenSSL 1.0.1g签名时必须显式指定-extensions参数,否则会忽略配置里的扩展:
openssl ca -in server.csr -out server.crt -cert intermediate.crt -keyfile intermediate.key -config openssl-intermediate.cnf -extensions server_cert
这里的-extensions server_cert对应中间CA配置里的[ server_cert ]段,必须写对。
4. 验证最终证书
检查签名后的服务器证书是否带SAN:
openssl x509 -text -noout -in server.crt
确认X509v3 Subject Alternative Name字段存在,内容正确。
额外提醒
- 中间CA的证书必须有
basicConstraints = CA:TRUE和keyUsage = cRLSign, keyCertSign,否则没资格签下级证书。 - 证书链合并顺序要对:服务器证书 → 中间CA证书 → 根CA证书,按这个顺序拼接成一个PEM文件。
- 测试前清浏览器缓存,或者用隐私窗口,避免旧证书干扰。
内容的提问来源于stack exchange,提问作者SpacemanScott
相关产品推荐
相关产品推荐

