第7课:SSL/TLS配置

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

推广

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

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配置:

  1. SSL基础:HTTPS原理、证书类型
  2. 证书获取:Let’s Encrypt、商业证书、自签名证书
  3. Nginx配置:基本配置、安全配置、高级功能
  4. HTTP/2:启用配置、服务器推送
  5. 性能优化:会话复用、OCSP装订、硬件加速
  6. 安全实践:安全头、证书管理、SSL测试

下一课预告

在下一课中,我们将学习缓存配置,包括:

  • 静态文件缓存
  • 代理缓存配置
  • 缓存策略优化
  • 缓存清理管理

💡 小贴士:SSL/TLS配置是现代Web服务的必备功能。建议使用TLS 1.2+版本,定期更新证书,并配置适当的安全头来提高网站安全性。

Vue3 + TypeScript 企业级项目实战

课程推荐

Vue3 + TypeScript 企业级项目实战
Python 全栈开发工程师培训

热门课程

Python 全栈开发工程师培训

📚 文章对你有帮助?请关注我的公众号,万分感谢!

获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号

关注公众号

第一时间获取最新技术文章

添加微信

添加微信

技术交流 · 问题答疑 · 学习指导

评论讨论

欢迎留下你的想法和建议