跳到主要内容

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.comexample.netexample.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 会自动:

  1. 扫描 Nginx 配置,列出可用的域名
  2. 向 Let's Encrypt 申请证书
  3. 修改 Nginx 配置,启用 HTTPS
  4. 设置 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 证书

免费证书申请

  1. 登录阿里云控制台,进入"SSL 证书"产品
  2. 点击"免费证书" → "创建证书"
  3. 填写域名信息,选择验证方式
  4. 添加 DNS 解析记录验证域名所有权
  5. 验证通过后下载证书

证书部署

下载 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 证书,申请流程类似:

  1. 进入"SSL 证书"产品
  2. 申请免费证书
  3. 填写域名信息并验证
  4. 下载并部署证书

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 配置的最佳实践。

下一章,我们将学习静态网站的部署方法,了解如何将静态网站发布到互联网上。