SSL/TLS配置
SSL/TLS基础
1. HTTPS工作原理
SSL/TLS握手过程
1. 客户端发送Client Hello
2. 服务器发送Server Hello + 证书
3. 客户端验证证书
4. 密钥交换
5. 建立加密连接
6. 开始加密通信
SSL/TLS版本
SSL 2.0 # 已废弃,存在安全漏洞
SSL 3.0 # 已废弃,存在安全漏洞
TLS 1.0 # 不推荐使用
TLS 1.1 # 不推荐使用
TLS 1.2 # 推荐使用
TLS 1.3 # 最新版本,推荐使用
2. 证书类型
按验证级别分类
DV证书(域名验证):
- 验证域名所有权
- 签发速度快
- 价格便宜
- 适合个人网站
OV证书(组织验证):
- 验证组织身份
- 显示组织信息
- 安全性较高
- 适合企业网站
EV证书(扩展验证):
- 最严格的验证
- 地址栏显示绿色
- 最高安全级别
- 适合金融、电商
按域名数量分类
单域名证书:
- 保护单个域名
- example.com
通配符证书:
- 保护主域名及所有子域名
- *.example.com
多域名证书(SAN):
- 保护多个不同域名
- example.com, test.com, demo.org
获取SSL证书
1. Let’s Encrypt免费证书
安装Certbot
# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx
# CentOS/RHEL
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx
# 或使用snap安装
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
申请证书
# 自动配置Nginx
sudo certbot --nginx -d example.com -d www.example.com
# 仅获取证书
sudo certbot certonly --nginx -d example.com -d www.example.com
# 使用webroot方式
sudo certbot certonly --webroot -w /var/www/html -d example.com
# 使用standalone方式(需要停止web服务器)
sudo certbot certonly --standalone -d example.com
证书续期
# 测试续期
sudo certbot renew --dry-run
# 手动续期
sudo certbot renew
# 自动续期(添加到crontab)
0 12 * * * /usr/bin/certbot renew --quiet
2. 商业证书
生成CSR(证书签名请求)
# 生成私钥
openssl genrsa -out example.com.key 2048
# 生成CSR
openssl req -new -key example.com.key -out example.com.csr
# 填写证书信息
Country Name: CN
State: Beijing
City: Beijing
Organization: Example Company
Organizational Unit: IT Department
Common Name: example.com
Email: admin@example.com
证书安装
# 证书文件说明
example.com.crt # 域名证书
intermediate.crt # 中间证书
root.crt # 根证书
# 合并证书链
cat example.com.crt intermediate.crt > example.com.chained.crt
3. 自签名证书
生成自签名证书
# 一步生成私钥和证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout example.com.key \
-out example.com.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Example/CN=example.com"
# 生成带SAN的证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout example.com.key \
-out example.com.crt \
-config <(
echo '[dn]'
echo CN=example.com
echo '[req]'
echo distinguished_name=dn
echo '[SAN]'
echo subjectAltName=DNS:example.com,DNS:www.example.com
echo '[v3_req]'
echo subjectAltName=@SAN
)
Nginx SSL配置
1. 基本SSL配置
HTTP重定向到HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
HTTPS服务器配置
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL证书配置
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# 网站配置
root /var/www/html;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
2. SSL安全配置
推荐的SSL配置
server {
listen 443 ssl http2;
server_name example.com;
# 证书配置
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# SSL协议版本
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 会话配置
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# OCSP装订
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 安全头
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
location / {
root /var/www/html;
index index.html;
}
}
3. 高级SSL配置
客户端证书验证
server {
listen 443 ssl;
server_name secure.example.com;
# 服务器证书
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
# 客户端证书验证
ssl_client_certificate /etc/ssl/certs/ca.crt;
ssl_verify_client on;
ssl_verify_depth 2;
location / {
# 可以在这里使用客户端证书信息
proxy_set_header X-SSL-Client-Cert $ssl_client_cert;
proxy_set_header X-SSL-Client-DN $ssl_client_s_dn;
proxy_pass http://backend;
}
}
SNI(服务器名称指示)
# 多个SSL站点共享同一IP
server {
listen 443 ssl;
server_name site1.example.com;
ssl_certificate /etc/ssl/certs/site1.crt;
ssl_certificate_key /etc/ssl/private/site1.key;
}
server {
listen 443 ssl;
server_name site2.example.com;
ssl_certificate /etc/ssl/certs/site2.crt;
ssl_certificate_key /etc/ssl/private/site2.key;
}
HTTP/2配置
1. 启用HTTP/2
HTTP/2基本配置
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# HTTP/2推送
location / {
root /var/www/html;
# 推送关键资源
http2_push /css/style.css;
http2_push /js/app.js;
}
}
HTTP/2优化配置
http {
# HTTP/2设置
http2_max_field_size 16k;
http2_max_header_size 32k;
http2_max_requests 1000;
http2_recv_timeout 30s;
server {
listen 443 ssl http2;
server_name example.com;
# 其他配置...
}
}
2. HTTP/2服务器推送
静态推送
location / {
root /var/www/html;
# 推送CSS和JS文件
location = /index.html {
http2_push /css/bootstrap.css;
http2_push /css/style.css;
http2_push /js/jquery.js;
http2_push /js/app.js;
}
}
动态推送
location / {
# 基于Link头的推送
http2_push_preload on;
proxy_pass http://backend;
proxy_set_header Host $host;
}
SSL性能优化
1. 会话复用
SSL会话缓存
http {
# 共享会话缓存
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
# 禁用会话票据(可选)
ssl_session_tickets off;
}
会话票据
http {
# 启用会话票据
ssl_session_tickets on;
ssl_session_ticket_key /etc/ssl/private/ticket.key;
# 定期轮换票据密钥
ssl_session_ticket_key /etc/ssl/private/ticket1.key;
ssl_session_ticket_key /etc/ssl/private/ticket2.key;
}
2. OCSP装订
OCSP配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# OCSP装订
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/chain.crt;
# DNS解析器
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
}
3. 硬件加速
SSL硬件加速
# 使用硬件加速(如果支持)
ssl_engine aesni;
# 或使用Intel QAT
load_module modules/ngx_ssl_engine_qat_module.so;
ssl_engine qat;
安全最佳实践
1. 安全头配置
完整的安全头
server {
listen 443 ssl http2;
server_name example.com;
# SSL配置...
# 安全头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
}
2. 证书管理
证书监控
#!/bin/bash
# 证书过期检查脚本
CERT_FILE="/etc/ssl/certs/example.com.crt"
DAYS_WARNING=30
# 获取证书过期时间
EXPIRE_DATE=$(openssl x509 -in $CERT_FILE -noout -enddate | cut -d= -f2)
EXPIRE_TIMESTAMP=$(date -d "$EXPIRE_DATE" +%s)
CURRENT_TIMESTAMP=$(date +%s)
# 计算剩余天数
DAYS_LEFT=$(( ($EXPIRE_TIMESTAMP - $CURRENT_TIMESTAMP) / 86400 ))
if [ $DAYS_LEFT -lt $DAYS_WARNING ]; then
echo "Warning: SSL certificate expires in $DAYS_LEFT days"
# 发送告警邮件
echo "SSL certificate for example.com expires in $DAYS_LEFT days" | mail -s "SSL Certificate Warning" admin@example.com
fi
3. SSL测试
在线SSL测试
SSL Labs测试:
https://www.ssllabs.com/ssltest/
测试项目:
- 证书有效性
- 协议支持
- 加密套件
- 安全配置
- 漏洞检测
命令行测试
# 测试SSL连接
openssl s_client -connect example.com:443 -servername example.com
# 检查证书信息
openssl x509 -in certificate.crt -text -noout
# 验证证书链
openssl verify -CAfile ca-bundle.crt certificate.crt
# 测试特定协议
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
故障排除
1. 常见SSL错误
证书错误
ERR_CERT_COMMON_NAME_INVALID:
- 证书域名不匹配
- 检查server_name配置
- 确认证书包含正确域名
ERR_CERT_DATE_INVALID:
- 证书过期或未生效
- 检查系统时间
- 更新证书
ERR_CERT_AUTHORITY_INVALID:
- 证书链不完整
- 添加中间证书
- 检查根证书
配置错误
SSL握手失败:
- 检查ssl_protocols配置
- 验证加密套件兼容性
- 确认证书文件路径
混合内容错误:
- HTTPS页面包含HTTP资源
- 更新资源链接为HTTPS
- 使用相对路径
2. 性能问题
SSL性能诊断
# 测试SSL握手时间
curl -w "@curl-format.txt" -o /dev/null -s "https://example.com/"
# curl-format.txt内容:
time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_appconnect: %{time_appconnect}\n
time_pretransfer: %{time_pretransfer}\n
time_redirect: %{time_redirect}\n
time_starttransfer: %{time_starttransfer}\n
time_total: %{time_total}\n
总结
本课程详细介绍了Nginx的SSL/TLS配置:
- SSL基础:HTTPS原理、证书类型
- 证书获取:Let’s Encrypt、商业证书、自签名证书
- Nginx配置:基本配置、安全配置、高级功能
- HTTP/2:启用配置、服务器推送
- 性能优化:会话复用、OCSP装订、硬件加速
- 安全实践:安全头、证书管理、SSL测试
下一课预告
在下一课中,我们将学习缓存配置,包括:
- 静态文件缓存
- 代理缓存配置
- 缓存策略优化
- 缓存清理管理
💡 小贴士:SSL/TLS配置是现代Web服务的必备功能。建议使用TLS 1.2+版本,定期更新证书,并配置适当的安全头来提高网站安全性。
📚 文章对你有帮助?请关注我的公众号,万分感谢!
获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号
第一时间获取最新技术文章

添加微信
技术交流 · 问题答疑 · 学习指导
评论讨论
欢迎留下你的想法和建议