8.1.3 获取 SSL 证书

简介

SSL/TLS 证书用于在客户端浏览器和服务器之间建立加密连接,保障数据在传输过程中不被窃取或篡改。现代浏览器会对没有有效证书的站点发出警告,因此部署 HTTPS 已成为 Web 服务的标准做法。

原理

  • 公钥/私钥对:服务器生成一对密钥,将公钥提交给证书颁发机构(CA)以生成证书。私钥保存在服务器,绝不可泄露。
  • 证书链:CA 的根证书或中间证书构成链条,浏览器通过信任链验证站点证书的合法性。
  • 握手过程:客户端与服务器协商加密算法、交换公钥,建立会话密钥,再通过对称加密传输数据。

服务商

免费证书

  1. Let's Encrypt

    • 最受欢迎的免费 CA,由非营利组织提供。
    • 使用 ACME 协议自动签发与续期。
    • 有大量客户端工具,例如 certbot
    • 证书有效期 90 天,推荐使用自动续期脚本。
  2. ZeroSSL

    • 提供 90 天免费证书,可通过 ACME 或 Web 界面获取。
    • 也支持商业付费计划。
  3. Buypass

    • 挪威的 CA,提供 180 天证书同样通过 ACME 签发。常用于不希望频繁续期的场景。

付费证书

  1. DigiCert/GeoTrust/Thawte/RapidSSL(同属 DigiCert 集团)
  2. Comodo/Sectigo
  3. GoDaddy
  4. 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.pemprivkey.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

测试

  1. 浏览器访问:在浏览器输入 https://example.com,确认无安全警告并显示锁形图标。
  2. 命令行工具
    curl -I https://example.com
    # 或者使用 openssl 检查证书细节
    openssl s_client -connect example.com:443 -showcerts
    
  3. 在线检测:使用 SSL Labshttps://www.htbridge.com/ssl/ 等工具进行全面评估。

小贴士

  • 使用 Let's Encrypt 时可将续期命令加入 cron: 0 3 * * * /usr/bin/certbot renew --quiet
  • 私钥权限应设置为 600 且仅 www-data 或 root 可读。可能还需要在备份策略中排除。
  • 对于负载均衡或多台服务器,可将证书复制到所有节点或使用集中管理(例如通过 Ansible)。

本文提供了 Web 服务章节所需的 SSL 获取与部署概览,适用于 Apache 与 Nginx 环境。

results matching ""

    No results matching ""