1. 为什么我们需要自签名证书链?
在Azure Windows环境中部署服务时,SSL/TLS证书是保障通信安全的基础设施。自签名证书链(Self-Signed Certificate Chain)相比单层证书具有以下不可替代的优势:
- 完整信任链验证:浏览器和客户端会逐级验证从终端证书到根证书的完整链条,模拟真实CA签发环境
- 多级权限隔离:根证书(Root CA)可以离线保存,仅用中间证书(Intermediate CA)签发终端证书,降低私钥泄露风险
- 测试场景还原度:更贴近企业实际PKI体系,避免单证书测试通过但正式部署时因证书链问题失败
重要提示:自签名证书仅适用于测试和开发环境,生产环境必须使用受信任CA签发的证书
2. 环境准备与OpenSSL配置
2.1 OpenSSL for Windows安装指南
虽然Azure Windows Server默认不包含OpenSSL,但推荐通过以下方式获取可靠版本:
- 访问OpenSSL官网下载页(注意避开第三方修改版)
- 选择
Win64 OpenSSL v1.1.1x Light安装包(约5MB) - 安装时勾选"Add OpenSSL to the system PATH"
验证安装成功:
openssl version # 应显示类似 OpenSSL 1.1.1u 30 May 20232.2 关键目录结构规划
建议在C盘创建专用工作目录:
C:\Certs\ ├── root\ # 根证书材料 ├── intermediate\ # 中间证书材料 └── server\ # 终端证书材料3. 生成三级证书链全流程
3.1 生成根证书(Root CA)
创建根证书私钥(2048位RSA):
openssl genrsa -aes256 -out C:\Certs\root\rootCA.key 2048此处会提示输入保护密码,建议使用12位以上混合字符
生成自签名根证书(有效期10年):
openssl req -x509 -new -nodes -key C:\Certs\root\rootCA.key \ -sha256 -days 3650 -out C:\Certs\root\rootCA.crt \ -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/OU=IT/CN=MyRootCA"3.2 生成中间证书(Intermediate CA)
创建中间CA私钥:
openssl genrsa -out C:\Certs\intermediate\intermediateCA.key 2048生成证书签名请求(CSR):
openssl req -new -key C:\Certs\intermediate\intermediateCA.key \ -out C:\Certs\intermediate\intermediateCA.csr \ -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/OU=IT/CN=MyIntermediateCA"用根CA签发中间证书(有效期5年):
openssl x509 -req -in C:\Certs\intermediate\intermediateCA.csr \ -CA C:\Certs\root\rootCA.crt -CAkey C:\Certs\root\rootCA.key \ -CAcreateserial -out C:\Certs\intermediate\intermediateCA.crt \ -days 1825 -sha2563.3 生成服务器证书
创建服务器私钥:
openssl genrsa -out C:\Certs\server\server.key 2048生成CSR(注意CN需匹配域名):
openssl req -new -key C:\Certs\server\server.key \ -out C:\Certs\server\server.csr \ -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/OU=Web/CN=mysite.example.com"用中间CA签发服务器证书(有效期1年):
openssl x509 -req -in C:\Certs\server\server.csr \ -CA C:\Certs\intermediate\intermediateCA.crt \ -CAkey C:\Certs\intermediate\intermediateCA.key \ -CAcreateserial -out C:\Certs\server\server.crt \ -days 365 -sha2564. 证书链验证与格式转换
4.1 验证证书链完整性
组合证书链文件:
type C:\Certs\server\server.crt C:\Certs\intermediate\intermediateCA.crt > C:\Certs\server\fullchain.crt验证链结构:
openssl verify -CAfile C:\Certs\root\rootCA.crt -untrusted C:\Certs\intermediate\intermediateCA.crt C:\Certs\server\server.crt # 应显示 OK openssl crl2pkcs7 -nocrl -certfile C:\Certs\server\fullchain.crt | openssl pkcs7 -print_certs -noout # 查看完整证书链信息4.2 生成PFX格式证书(用于IIS/Azure)
合并私钥和证书链为PFX:
openssl pkcs12 -export -out C:\Certs\server\server.pfx \ -inkey C:\Certs\server\server.key \ -in C:\Certs\server\server.crt \ -certfile C:\Certs\intermediate\intermediateCA.crt \ -password pass:YourPFXPassword5. Azure环境证书部署要点
5.1 上传到Azure Key Vault
使用Azure CLI上传PFX:
az keyvault certificate import --vault-name MyVault \ --name MyCert --file C:\Certs\server\server.pfx \ --password YourPFXPassword5.2 IIS服务器绑定配置
- 打开IIS管理器 → 服务器证书
- 导入PFX文件(需提供密码)
- 站点绑定中选择HTTPS和导入的证书
5.3 客户端信任配置
将根证书rootCA.crt:
- 双击安装到"受信任的根证书颁发机构"
- 通过组策略批量部署(企业环境)
6. 常见问题排查指南
6.1 证书链不完整错误
症状:浏览器显示"此证书因为颁发者证书未知而不被信任"
解决方案:
# 确认中间证书是否正确包含 openssl s_client -connect mysite.example.com:443 -showcerts6.2 SCHANNEL错误日志分析
查看Windows系统日志:
事件查看器 → Windows日志 → 系统 → 筛选来源"Schannel"典型错误:
- 0x80090326:证书链验证失败
- 0x80092004:证书已吊销
6.3 证书密钥用法不匹配
修正方法:生成CSR时添加扩展文件
[ req_ext ] subjectAltName = DNS:mysite.example.com keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth7. 高级配置技巧
7.1 证书自动续期方案
使用PowerShell脚本自动化:
# 检查证书过期时间 $cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -match "mysite" } $cert.NotAfter7.2 证书吊销列表(CRL)生成
创建CRL分发点:
openssl ca -gencrl -keyfile C:\Certs\intermediate\intermediateCA.key \ -cert C:\Certs\intermediate\intermediateCA.crt \ -out C:\Certs\intermediate\intermediateCA.crl7.3 证书透明度日志(CT)模拟
虽然自签名证书不需要CT,但可以添加SCT扩展:
openssl x509 -in C:\Certs\server\server.crt -text -noout | findstr "CT"在实际操作中发现,Azure应用服务对证书链的处理有特殊要求——必须确保中间证书在PFX中的顺序正确。一个可靠的验证方法是使用OpenSSL重新解压PFX查看证书顺序:
openssl pkcs12 -in server.pfx -nodes -info正确的顺序应该是:服务器证书 → 中间证书(不能包含根证书)