8.1.3 获取 SSL 证书
简介
SSL/TLS 证书用于在客户端浏览器和服务器之间建立加密连接,保障数据在传输过程中不被窃取或篡改。现代浏览器会对没有有效证书的站点发出警告,因此部署 HTTPS 已成为 Web 服务的标准做法。
原理
- 公钥/私钥对:服务器生成一对密钥,将公钥提交给证书颁发机构(CA)以生成证书。私钥保存在服务器,绝不可泄露。
- 证书链:CA 的根证书或中间证书构成链条,浏览器通过信任链验证站点证书的合法性。
- 握手过程:客户端与服务器协商加密算法、交换公钥,建立会话密钥,再通过对称加密传输数据。
服务商
免费证书
Let's Encrypt
- 最受欢迎的免费 CA,由非营利组织提供。
- 使用 ACME 协议自动签发与续期。
- 有大量客户端工具,例如
certbot。 - 证书有效期 90 天,推荐使用自动续期脚本。
ZeroSSL
- 提供 90 天免费证书,可通过 ACME 或 Web 界面获取。
- 也支持商业付费计划。
Buypass
- 挪威的 CA,提供 180 天证书同样通过 ACME 签发。常用于不希望频繁续期的场景。
付费证书
- DigiCert/GeoTrust/Thawte/RapidSSL(同属 DigiCert 集团)
- Comodo/Sectigo
- GoDaddy
- GlobalSign
付费证书通常提供更长的有效期(1-2 年)、更高的保险额度、企业验证(OV/EV)和更专业的客户支持。适用于商业网站和需要信任标识的场景。
安装及获取流程
使用 Certbot (Let's Encrypt)
sudo apt update
sudo apt install certbot python3-certbot-apache # Apache 插件
# 或者 python3-certbot-nginx
# 利用 Apache 插件自动获取并配置证书
sudo certbot --apache -d example.com -d www.example.com
# 手动获取证书(仅下载到 /etc/letsencrypt/live/example.com/)
sudo certbot certonly --webroot -w /var/www/html -d example.com
获取后会在 /etc/letsencrypt/live/域名/ 下生成 fullchain.pem 和 privkey.pem 等文件。
手动生成 CSR 并提交给付费 CA
# 生成私钥和 CSR
openssl genrsa -out example.com.key 2048
openssl req -new -key example.com.key -out example.com.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=example.com"
将 CSR 提交到 CA 的管理界面,完成域名验证后下载证书(通常为 example.com.crt)。
在 Apache 中安装证书
修改虚拟主机配置:
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# 若有中间证书,使用 SSLCertificateChainFile 指向
</VirtualHost>
启用模块并重启:
sudo a2enmod ssl
sudo systemctl restart apache2
对于 Nginx:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
在 Nginx 中安装证书
sudo nginx -t && sudo systemctl reload nginx
测试
- 浏览器访问:在浏览器输入
https://example.com,确认无安全警告并显示锁形图标。 - 命令行工具:
curl -I https://example.com # 或者使用 openssl 检查证书细节 openssl s_client -connect example.com:443 -showcerts - 在线检测:使用 SSL Labs 或 https://www.htbridge.com/ssl/ 等工具进行全面评估。
小贴士
- 使用 Let's Encrypt 时可将续期命令加入 cron:
0 3 * * * /usr/bin/certbot renew --quiet - 私钥权限应设置为
600且仅 www-data 或 root 可读。可能还需要在备份策略中排除。 - 对于负载均衡或多台服务器,可将证书复制到所有节点或使用集中管理(例如通过 Ansible)。
本文提供了 Web 服务章节所需的 SSL 获取与部署概览,适用于 Apache 与 Nginx 环境。