SSL 证书与 HTTPS
HTTPS 是现代网站的标准配置,它通过 SSL/TLS 协议加密浏览器与服务器之间的通信,保护用户数据安全。本章将介绍 HTTPS 的工作原理、SSL 证书的申请和配置方法。
什么是 HTTPS?
HTTPS(Hyper Text Transfer Protocol Secure)是 HTTP 的安全版本,在 HTTP 的基础上加入了 SSL/TLS 协议层。HTTPS 提供了三重安全保障:
数据加密
HTTPS 对传输的数据进行加密,防止数据在传输过程中被窃听。即使攻击者截获了数据包,也无法解密其中的内容。
数据完整性
HTTPS 通过消息认证码(MAC)确保数据在传输过程中不被篡改。如果数据被修改,接收方能够检测到。
身份认证
HTTPS 通过 SSL 证书验证服务器身份,防止用户访问假冒网站。证书由受信任的证书颁发机构(CA)签发,浏览器会验证证书的有效性。
HTTPS 的重要性
安全性
HTTPS 保护用户隐私,防止敏感信息(如密码、信用卡号)被窃取。对于登录、支付等涉及敏感数据的页面,HTTPS 是必须的。
SEO 优化
搜索引擎优先展示 HTTPS 网站。Google 官方明确表示 HTTPS 是搜索排名的一个因素,使用 HTTPS 可以获得更好的搜索排名。
用户信任
现代浏览器会对 HTTP 网站标记为"不安全",影响用户信任。HTTPS 网站显示安全锁图标,提升用户信心。
技术要求
许多现代 Web 技术要求 HTTPS,如 HTTP/2、Service Worker、PWA、WebRTC 等。没有 HTTPS,这些技术无法正常使用。
SSL/TLS 证书类型
SSL 证书由证书颁发机构(Certificate Authority,CA)签发,根据验证级别和覆盖范围,分为多种类型。
按验证级别分类
DV 证书(Domain Validation,域名验证)
DV 证书只验证域名所有权,签发速度快,通常几分钟内完成。适合个人网站、博客、测试环境等。
OV 证书(Organization Validation,组织验证)
OV 证书验证域名所有权和组织真实性,需要提交企业营业执照等材料。证书中包含组织信息,适合企业网站。
EV 证书(Extended Validation,扩展验证)
EV 证书验证最严格,需要验证组织的法律存在、物理地址、运营状态等。浏览器地址栏会显示组织名称,适合金融、电商等高安全要求网站。
按覆盖范围分类
单域名证书
保护一个域名,如 example.com。适合只有一个域名的网站。
多域名证书(SAN 证书)
保护多个域名,如 example.com、example.net、example.org。适合管理多个域名的场景。
通配符证书(Wildcard 证书)
保护主域名及其所有子域名,如 *.example.com。适合有多个子域名的网站。
按价格分类
免费证书
Let's Encrypt、ZeroSSL 等提供免费 DV 证书,有效期 90 天,可自动续期。适合个人网站和预算有限的项目。
付费证书
商业证书提供更长的有效期、更好的技术支持和保险赔付。适合企业网站和商业应用。
Let's Encrypt 免费证书
Let's Encrypt 是一个非营利性证书颁发机构,提供免费的 DV 证书。证书有效期 90 天,可以通过自动化工具无限续期。
Certbot 工具
Certbot 是 Let's Encrypt 官方推荐的证书管理工具,支持自动申请、安装和续期。
安装 Certbot
Ubuntu/Debian:
sudo apt update
sudo apt install certbot python3-certbot-nginx
CentOS/RHEL:
sudo yum install certbot python3-certbot-nginx
或使用 Snap 安装(推荐):
sudo snap install --classic certbot
申请证书
Nginx 环境
如果使用 Nginx 作为 Web 服务器,Certbot 可以自动配置:
sudo certbot --nginx
Certbot 会自动:
- 扫描 Nginx 配置,列出可用的域名
- 向 Let's Encrypt 申请证书
- 修改 Nginx 配置,启用 HTTPS
- 设置 HTTP 到 HTTPS 的自动重定向
Apache 环境
sudo certbot --apache
仅申请证书
如果需要手动配置,可以只申请证书:
sudo certbot certonly --nginx
# 或
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
证书文件保存在 /etc/letsencrypt/live/example.com/ 目录:
fullchain.pem:完整证书链privkey.pem:私钥文件
手动配置 Nginx
如果 Certbot 没有自动配置,可以手动修改 Nginx 配置:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000" always;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
测试配置并重载 Nginx:
sudo nginx -t
sudo systemctl reload nginx
自动续期
Let's Encrypt 证书有效期 90 天,需要定期续期。Certbot 可以设置自动续期:
sudo certbot renew --dry-run
测试续期命令正常后,Certbot 会自动添加定时任务。可以检查定时任务:
sudo systemctl list-timers | grep certbot
或查看 crontab:
sudo cat /etc/cron.d/certbot
DNS 验证
如果服务器在内网或无法通过 80 端口验证,可以使用 DNS 验证:
sudo certbot certonly --manual --preferred-challenges dns -d example.com
Certbot 会提示添加一条 TXT 记录用于验证。添加记录后按回车继续。
对于云服务商提供的 DNS,可以使用插件自动验证:
pip install certbot-dns-aliyun
certbot certonly --authenticator dns-aliyun --dns-aliyun-credentials /path/to/credentials.ini -d example.com
云服务商 SSL 证书
国内云服务商提供 SSL 证书申请和管理服务。
阿里云 SSL 证书
免费证书申请:
- 登录阿里云控制台,进入"SSL 证书"产品
- 点击"免费证书" → "创建证书"
- 填写域名信息,选择验证方式
- 添加 DNS 解析记录验证域名所有权
- 验证通过后下载证书
证书部署:
下载 Nginx 格式证书,上传到服务器:
scp example.com.pem root@server:/etc/nginx/ssl/
scp example.com.key root@server:/etc/nginx/ssl/
修改 Nginx 配置:
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
腾讯云 SSL 证书
腾讯云提供免费的 TrustAsia DV 证书,申请流程类似:
- 进入"SSL 证书"产品
- 申请免费证书
- 填写域名信息并验证
- 下载并部署证书
SSL 配置最佳实践
协议版本
只启用 TLS 1.2 和 TLS 1.3,禁用不安全的 SSL 3.0、TLS 1.0、TLS 1.1:
ssl_protocols TLSv1.2 TLSv1.3;
加密套件
使用强加密套件,推荐配置:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
HSTS
启用 HSTS(HTTP Strict Transport Security),强制浏览器使用 HTTPS:
add_header Strict-Transport-Security "max-age=63072000" always;
OCSP Stapling
启用 OCSP Stapling,提高证书验证效率:
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
SSL Session
配置 SSL Session 缓存,提高性能:
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
SSL 证书测试
在线测试
使用 SSL Labs SSL Test 测试 SSL 配置,获得评分和改进建议。
命令行测试
使用 openssl 命令测试:
openssl s_client -connect example.com:443 -servername example.com
检查证书信息:
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -text -noout
测试证书过期时间:
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
常见问题
证书链不完整
如果证书链不完整,浏览器可能显示证书不受信任。确保使用 fullchain.pem 而不是 cert.pem:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
混合内容
HTTPS 页面加载 HTTP 资源会导致混合内容警告。确保所有资源都使用 HTTPS:
<script src="https://example.com/script.js"></script>
证书续期失败
检查 80 端口是否可访问,防火墙是否放行。检查域名解析是否正确指向服务器。
小结
HTTPS 是现代网站的标配,SSL 证书是实现 HTTPS 的关键。本章介绍了 HTTPS 的原理、SSL 证书的类型、Let's Encrypt 免费证书的申请和配置方法,以及 SSL 配置的最佳实践。
下一章,我们将学习静态网站的部署方法,了解如何将静态网站发布到互联网上。