自建PKI完整SSL证书链:如何解决浏览器不信任问题?
自建PKI证书链获浏览器信任参考指南
一、PKI体系架构
- 根CA:离线存储,仅用于签署中间CA证书,生命周期最长(建议10年)
- 中间CA:在线使用,用于签署服务器/客户端证书,生命周期建议5年
- 终端证书:服务器/客户端使用,生命周期建议1年
二、证书生成全流程
1. 创建根CA
- 初始化目录:
mkdir -p rootCA/{certs,crl,newcerts,private} touch rootCA/index.txt echo 1000 > rootCA/serial - 编写
root_openssl.cnf:[req] distinguished_name = req_distinguished_name x509_extensions = v3_ca [req_distinguished_name] countryName = CN stateOrProvinceName = Beijing localityName = Beijing organizationName = MyRootCA commonName = My Root CA [v3_ca] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = CA:TRUE keyUsage = cRLSign, keyCertSign - 生成根CA密钥与证书:
openssl req -x509 -new -nodes -key rootCA/private/rootCA.key -sha256 -days 3650 -out rootCA/certs/rootCA.pem -config root_openssl.cnf
2. 创建中间CA
- 初始化目录:
mkdir -p intermediate/{certs,crl,newcerts,private} touch intermediate/index.txt echo 1000 > intermediate/serial - 编写
intermediate_openssl.cnf:[req] distinguished_name = req_distinguished_name req_extensions = v3_req [req_distinguished_name] countryName = CN stateOrProvinceName = Beijing localityName = Beijing organizationName = MyIntermediateCA commonName = My Intermediate CA [v3_req] basicConstraints = CA:TRUE, pathlen:0 keyUsage = cRLSign, keyCertSign subjectAltName = @alt_names [alt_names] DNS.1 = intermediate-ca.myorg.com - 生成中间CA密钥、CSR,并由根CA签署:
openssl req -new -nodes -key intermediate/private/intermediate.key -out intermediate/certs/intermediate.csr -config intermediate_openssl.cnf openssl x509 -req -in intermediate/certs/intermediate.csr -CA rootCA/certs/rootCA.pem -CAkey rootCA/private/rootCA.key -CAcreateserial -out intermediate/certs/intermediate.pem -days 1825 -extensions v3_req -extfile intermediate_openssl.cnf
3. 生成服务器证书
- 编写
server_openssl.cnf(必须包含SAN):[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] countryName = CN stateOrProvinceName = Beijing localityName = Beijing organizationName = MyOrg commonName = your-domain.com [v3_req] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = your-domain.com DNS.2 = www.your-domain.com - 生成服务器密钥、CSR,并由中间CA签署:
openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr -config server_openssl.cnf openssl x509 -req -in server.csr -CA intermediate/certs/intermediate.pem -CAkey intermediate/private/intermediate.key -CAcreateserial -out server.pem -days 365 -extensions v3_req -extfile server_openssl.cnf
三、服务器配置
- 构建证书链:将服务器证书与中间CA证书合并,顺序为服务器证书在前,中间CA在后
cat server.pem intermediate/certs/intermediate.pem > chain.pem - Nginx配置示例:
server { listen 443 ssl; server_name your-domain.com www.your-domain.com; ssl_certificate /path/to/chain.pem; ssl_certificate_key /path/to/server.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; }
四、浏览器信任配置
1. 系统信任库导入(Chrome/Edge等适用)
- Linux:
sudo cp rootCA/certs/rootCA.pem /usr/local/share/ca-certificates/rootCA.crt sudo update-ca-certificates - Windows:
双击rootCA.pem→ 「安装证书」 → 选择「本地计算机」 → 下一步 → 「将所有证书放入下列存储」 → 浏览选择「受信任的根证书颁发机构」 → 完成 - macOS:
双击rootCA.pem→ 「添加到钥匙串」 → 选择「系统」钥匙串 → 找到证书右键「显示简介」 → 「信任」选项卡选择「始终信任」
2. Firefox独立信任配置
打开Firefox → 设置 → 隐私与安全 → 找到「证书」区域 → 「查看证书」 → 「权威机构」 → 「导入」 → 选择rootCA.pem → 勾选「信任该CA来标识网站」 → 确认
五、验证方法
- 用OpenSSL验证证书链有效性:
openssl verify -CAfile rootCA/certs/rootCA.pem -untrusted intermediate/certs/intermediate.pem server.pem - 浏览器访问网站,确认无证书错误提示
内容的提问来源于stack exchange,提问作者Dragis
相关产品推荐
相关产品推荐

