1. 为什么需要SSL证书
前几天帮同事排查一个HTTPS访问问题,发现他们测试环境用的还是HTTP协议。现代浏览器对非HTTPS网站越来越不友好,不仅会显示"不安全"警告,某些新特性API也直接禁用。这让我意识到很多开发者对SSL证书配置还存在认知盲区。
SSL证书的核心作用有三个:加密传输数据、验证服务器身份、确保数据完整性。没有它,你的网站就像在裸奔,所有流量都是明文传输,中间人随时可以窃听或篡改内容。Chrome从2017年开始就把HTTP页面标记为"不安全",现在更是直接阻止混合内容加载。
2. 证书生成方案选型
2.1 自签名证书 vs CA签发证书
自签名证书适合:
- 内网测试环境
- 开发调试
- 需要快速验证HTTPS功能的场景
CA签发证书适合:
- 生产环境
- 需要浏览器默认信任的场合
- 商业网站
重要提示:自签名证书需要手动导入到系统信任库,否则浏览器会显示安全警告。而Let's Encrypt等免费CA签发的证书会被主流浏览器自动信任。
2.2 OpenSSL vs Certbot工具链
OpenSSL是底层加密库,直接使用需要熟悉各种参数:
bash复制openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout example.key -out example.crt
Certbot是自动化工具,适合新手:
bash复制sudo certbot --nginx -d example.com
3. OpenSSL生成证书实操
3.1 生成私钥和CSR
首先生成2048位的RSA私钥:
bash复制openssl genrsa -out example.key 2048
然后用这个私钥生成证书签名请求(CSR):
bash复制openssl req -new -key example.key -out example.csr
这里会交互式询问国家、组织等信息,Common Name要填写你的域名。
3.2 自签名证书生成
对于测试环境,可以直接生成自签名证书:
bash复制openssl x509 -req -days 365 -in example.csr \
-signkey example.key -out example.crt
生成的三个关键文件:
- example.key:私钥文件,必须严格保密
- example.csr:证书签名请求文件
- example.crt:最终证书文件
4. Nginx配置HTTPS
4.1 基础配置模板
nginx复制server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/example.crt;
ssl_certificate_key /path/to/example.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /var/www/html;
index index.html;
}
}
4.2 关键参数解析
ssl_protocols:禁用不安全的SSLv3和TLSv1.0/1.1ssl_ciphers:指定加密套件,排除已知弱算法ssl_prefer_server_ciphers on:让服务器决定加密方式
配置检查命令:
sudo nginx -t
5. 让浏览器信任自签名证书
5.1 Windows系统导入
- 双击.crt文件
- 选择"安装证书"
- 存储位置选"本地计算机"
- 选择"将所有证书放入下列存储"-"受信任的根证书颁发机构"
5.2 macOS系统导入
bash复制sudo security add-trusted-cert -d -r trustRoot \
-k /Library/Keychains/System.keychain example.crt
5.3 Linux系统导入
bash复制# 对于Debian/Ubuntu
sudo cp example.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
# 对于CentOS/RHEL
sudo cp example.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
6. 高级配置技巧
6.1 证书自动续期
使用crontab设置定时任务:
bash复制0 3 * * * /usr/bin/certbot renew --quiet
6.2 HSTS增强安全
在Nginx配置中添加:
nginx复制add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
6.3 OCSP装订配置
nginx复制ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem;
7. 常见问题排查
7.1 证书不受信任
症状:浏览器显示"您的连接不是私密连接"
解决方法:
- 确保证书已正确导入系统信任库
- 检查证书链是否完整
- 验证证书是否过期
7.2 混合内容警告
症状:HTTPS页面加载HTTP资源
解决方法:
- 使用相对协议//example.com/resource.js
- 配置Content-Security-Policy头
7.3 SSL握手失败
常见错误码:
- ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- ERR_SSL_PROTOCOL_ERROR
排查步骤:
- 检查Nginx错误日志:
tail -f /var/log/nginx/error.log - 测试SSL配置:
openssl s_client -connect example.com:443 - 使用在线检测工具:SSL Labs测试
8. 性能优化建议
8.1 会话复用配置
nginx复制ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
8.2 TLS 1.3优先
nginx复制ssl_protocols TLSv1.3 TLSv1.2;
ssl_prefer_server_ciphers on;
8.3 证书链优化
确保中间证书正确拼接:
bash复制cat example.crt intermediate.crt > chained.crt
9. 安全加固措施
9.1 禁用不安全的加密套件
nginx复制ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
9.2 私钥文件权限
bash复制chmod 400 example.key
chown root:root example.key
9.3 定期轮换证书
建议每3个月更新一次证书,即使使用长期有效的自签名证书也应定期更换。
10. 证书监控方案
10.1 过期监控脚本
bash复制#!/bin/bash
end_date=$(openssl x509 -enddate -noout -in /etc/nginx/ssl/example.crt | cut -d= -f2)
end_epoch=$(date -d "$end_date" +%s)
now_epoch=$(date +%s)
days_left=$(( (end_epoch - now_epoch) / 86400 ))
if [ $days_left -lt 30 ]; then
echo "证书将在 $days_left 天后过期" | mail -s "证书过期警告" admin@example.com
fi
10.2 Prometheus监控
配置blackbox_exporter监控HTTPS端点:
yaml复制modules:
http_2xx:
prober: http
http:
preferred_ip_protocol: "ip4"
tls_config:
insecure_skip_verify: false
11. 多域名证书管理
11.1 SAN证书生成
创建包含多个域名的证书:
openssl.cnf复制[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = dev.example.com
生成命令:
bash复制openssl req -new -key example.key -out example.csr \
-config openssl.cnf
11.2 Nginx多域名配置
nginx复制server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /path/to/wildcard.crt;
ssl_certificate_key /path/to/wildcard.key;
# 其他配置...
}
12. 证书格式转换
12.1 PEM转PKCS#12
bash复制openssl pkcs12 -export -out example.pfx \
-inkey example.key -in example.crt
12.2 DER格式转换
bash复制# PEM转DER
openssl x509 -outform der -in example.crt -out example.der
# DER转PEM
openssl x509 -inform der -in example.der -out example.pem
13. 证书吊销处理
13.1 生成CRL
bash复制openssl ca -gencrl -out ca.crl \
-keyfile ca.key -cert ca.crt
13.2 OCSP响应配置
nginx复制ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem;
resolver 8.8.8.8 valid=300s;
14. 客户端证书认证
14.1 生成客户端证书
bash复制openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 365 -in client.csr \
-CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
14.2 Nginx配置双向认证
nginx复制ssl_client_certificate /path/to/ca.crt;
ssl_verify_client on;
15. 证书透明度日志
15.1 CT日志提交
使用certbot自动提交:
bash复制sudo certbot --nginx -d example.com \
--ct-submission
15.2 检查CT状态
bash复制openssl x509 -in example.crt -text \
| grep -A 10 "CT Precertificate SCTs"
16. 证书链验证
16.1 验证证书链
bash复制openssl verify -CAfile ca.crt example.crt
16.2 完整链文件生成
bash复制cat example.crt intermediate.crt root.crt > fullchain.crt
17. 密钥轮换策略
17.1 平滑更换证书
nginx复制# 新老证书并存配置
ssl_certificate /path/to/new.crt;
ssl_certificate_key /path/to/new.key;
ssl_certificate /path/to/old.crt;
ssl_certificate_key /path/to/old.key;
17.2 零停机更新
- 上传新证书到服务器
- 测试新证书有效性
- 重载Nginx配置
- 监控一段时间后移除旧证书
18. 证书备份策略
18.1 备份内容清单
- 私钥文件(.key)
- 证书文件(.crt)
- 证书链文件(.pem)
- 加密密码(如果有)
18.2 安全存储建议
- 使用加密存储介质
- 设置最小权限访问
- 异地备份至少3份
- 定期验证备份可用性
19. 证书自动化管理
19.1 Ansible自动化部署
yaml复制- name: Deploy SSL certificate
copy:
src: /local/path/to/cert
dest: /remote/path/to/cert
owner: root
group: root
mode: '0644'
19.2 Terraform证书管理
hcl复制resource "tls_private_key" "example" {
algorithm = "RSA"
rsa_bits = 2048
}
resource "tls_self_signed_cert" "example" {
private_key_pem = tls_private_key.example.private_key_pem
subject {
common_name = "example.com"
organization = "Example Inc"
}
validity_period_hours = 8760
allowed_uses = [
"key_encipherment",
"digital_signature",
"server_auth",
]
}
20. 证书最佳实践总结
- 生产环境尽量使用CA签发的证书
- 私钥必须严格保护,建议使用HSM存储
- 定期轮换证书,即使未到期
- 监控证书过期时间,设置提前告警
- 禁用不安全的协议和加密套件
- 启用HSTS和OCSP装订
- 保持证书链完整
- 测试环境也要使用HTTPS
- 考虑使用证书自动化管理工具
- 制定完善的证书管理流程