Certbot 完全使用指南

目录

  1. 简介
  2. 安装
  3. 申请证书
  4. 配置Web服务器
  5. 证书续期
  6. 证书管理
  7. 高级配置
  8. 常见问题
  9. 最佳实践

1. 简介

1.1 什么是 Certbot

Certbot 是 Let’s Encrypt 官方提供的免费、自动化 SSL/TLS 证书管理工具。

1.2 主要特点

  • 完全免费:Let’s Encrypt 证书永久免费
  • 自动化:自动申请、安装、续期
  • 安全性:支持现代加密算法
  • 简单易用:一条命令完成申请
  • 广泛支持:Apache、Nginx、Web服务器等

1.3 证书有效期

  • 默认有效期:90天
  • 建议续期时间:到期前30天
  • 自动续期:可设置定时任务自动续期

2. 安装

2.1 Ubuntu/Debian

# 更新软件包
sudo apt update

# 安装 Certbot
sudo apt install certbot

# 安装 Certbot 插件(可选)
sudo apt install python3-certbot-nginx    # Nginx插件
sudo apt install python3-certbot-apache  # Apache插件

2.2 CentOS 7

# 安装 EPEL 源
sudo yum install epel-release

# 安装 Certbot
sudo yum install certbot

# 安装 Nginx 插件
sudo yum install python2-certbot-nginx

2.3 CentOS 8 / Rocky Linux / AlmaLinux

# 安装 EPEL 源
sudo dnf install epel-release

# 安装 Certbot
sudo dnf install certbot

# 安装 Nginx 插件
sudo dnf install python3-certbot-nginx

2.4 Fedora

sudo dnf install certbot python3-certbot-nginx

2.5 从 Snap 安装(通用)

# 安装 Snap(如果没有)
sudo snap install core; sudo snap refresh core

# 安装 Certbot
sudo snap install --classic certbot

# 创建符号链接
sudo ln -s /snap/bin/certbot /usr/bin/certbot

2.6 验证安装

# 查看 Certbot 版本
certbot --version

# 查看 Certbot 帮助
certbot --help

# 列出已安装的插件
certbot plugins

3. 申请证书

3.1 验证方式对比

验证方式 端口 优点 缺点 适用场景
standalone 80 无需Web服务器 需要临时占用80端口 新服务器、测试环境
webroot 80/8080 不停止服务 需要网站根目录 生产环境
nginx 80 自动配置 需要Nginx运行 Nginx服务器
apache 80 自动配置 需要Apache运行 Apache服务器
dns 支持泛域名 需要DNS管理权限 泛域名证书

3.2 Standalone 模式(推荐新手)

特点:Certbot 自建临时服务器验证域名

# 步骤1:停止占用80端口的程序
sudo systemctl stop nginx

# 步骤2:申请单个域名证书
sudo certbot certonly --standalone -d example.com

# 步骤3:申请多个域名证书
sudo certbot certonly --standalone -d example.com -d www.example.com -d api.example.com

# 步骤4:指定邮箱(用于证书到期提醒)
sudo certbot certonly --standalone -d example.com --email admin@example.com --agree-tos --no-eff-email

# 步骤5:申请后启动服务
sudo systemctl start nginx

参数说明

  • certonly: 只申请证书,不自动配置
  • --standalone: 使用独立模式
  • -d: 指定域名(可多次使用)
  • --email: 指定邮箱
  • --agree-tos: 同意服务条款
  • --no-eff-email: 不加入EFF邮箱列表

3.3 Webroot 模式(推荐生产环境)

特点:在网站根目录创建验证文件

# 步骤1:申请证书(网站根目录)
sudo certbot certonly --webroot -w /var/www/html -d example.com

# 步骤2:多个域名,不同网站根目录
sudo certbot certonly --webroot \
  -w /var/www/html -d example.com \
  -w /var/www/blog -d blog.example.com

# 步骤3:自定义webroot路径(非标准目录)
sudo certbot certonly --webroot \
  --webroot-path=/var/www/website \
  -d example.com

# 步骤4:指定验证URL前缀
sudo certbot certonly --webroot \
  -w /var/www/html \
  -d example.com \
  --webroot-path=/var/www/html/.well-known/acme-challenge

3.4 Nginx 插件(自动配置)

特点:自动配置 Nginx 并申请证书

# 步骤1:自动申请并配置Nginx
sudo certbot --nginx -d example.com -d www.example.com

# 步骤2:只申请证书,不修改Nginx配置
sudo certbot certonly --nginx -d example.com

# 步骤3:强制更新证书(即使未到期)
sudo certbot --nginx -d example.com --force-renewal

# 步骤4:跳过交互式提问(自动化脚本)
sudo certbot --nginx -d example.com --non-interactive --agree-tos --email admin@example.com

3.5 Apache 插件

# 自动申请并配置Apache
sudo certbot --apache -d example.com

# 只申请证书
sudo certbot certonly --apache -d example.com

3.6 DNS 验证(泛域名证书)

特点:通过DNS TXT记录验证,支持泛域名

# 步骤1:手动DNS验证(会提示添加TXT记录)
sudo certbot certonly --manual --preferred-challenges dns -d example.com

# 步骤2:申请泛域名证书
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com

# 步骤3:指定邮箱
sudo certbot certonly --manual --preferred-challenges dns \
  -d "*.example.com" \
  -d example.com \
  --email admin@example.com \
  --agree-tos

申请流程

  1. 执行命令后会提示添加DNS TXT记录
  2. 登录域名DNS管理后台
  3. 添加指定的TXT记录
  4. 等待生效(通常1-5分钟)
  5. 按回车继续验证
  6. 验证成功后证书申请完成

3.7 DNS API 自动化(云服务商)

阿里云
# 安装DNS插件
sudo pip install certbot-dns-aliyun

# 创建配置文件
sudo mkdir -p /etc/letsencrypt
sudo nano /etc/letsencrypt/aliyun.ini
dns_aliyun_access_key_id = your-access-key-id
dns_aliyun_access_key_secret = your-access-key-secret
# 设置权限
sudo chmod 600 /etc/letsencrypt/aliyun.ini

# 申请证书
sudo certbot certonly \
  --dns-aliyun \
  --dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
  --dns-aliyun-propagation-seconds 30 \
  -d "*.example.com" -d example.com
腾讯云
# 安装DNS插件
sudo pip install certbot-dns-dnspod

# 创建配置文件
sudo nano /etc/letsencrypt/dnspod.ini
dns_dnspod_api_token = your-api-token
sudo chmod 600 /etc/letsencrypt/dnspod.ini

sudo certbot certonly \
  --dns-dnspod \
  --dns-dnspod-credentials /etc/letsencrypt/dnspod.ini \
  --dns-dnspod-propagation-seconds 30 \
  -d "*.example.com" -d example.com
Cloudflare
# 安装DNS插件
sudo pip install certbot-dns-cloudflare

# 创建配置文件
sudo nano /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = your-api-token
sudo chmod 600 /etc/letsencrypt/cloudflare.ini

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  --dns-cloudflare-propagation-seconds 30 \
  -d "*.example.com" -d example.com

3.8 批量申请证书

# 创建域名列表文件
cat > domains.txt << EOF
example.com,www.example.com
api.example.com
blog.example.com
*.app.example.com,app.example.com
EOF

# 循环申请
while IFS=',' read -r domains; do
  sudo certbot certonly --webroot -w /var/www/html -d $domains --email admin@example.com --agree-tos --non-interactive
done < domains.txt

4. 配置Web服务器

4.1 证书文件位置

申请成功后,证书文件位于:

/etc/letsencrypt/live/example.com/
├── fullchain.pem    # 完整证书链(服务器证书+中间证书)
├── privkey.pem      # 私钥
├── cert.pem         # 单个服务器证书
└── chain.pem        # 中间证书链

重要:始终使用 /etc/letsencrypt/live/example.com/ 下的符号链接,不要直接使用 /etc/letsencrypt/archive/ 下的文件。


4.2 Nginx 配置

基础HTTPS配置
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;

    location / {
        root /var/www/html;
        index index.html;
    }
}
完整HTTPS配置
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    # SSL证书配置
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # SSL协议
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    # 加密套件(推荐)
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';

    # SSL会话缓存
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # 安全头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;

    # 网站配置
    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

# HTTP自动跳转HTTPS
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}
多域名配置
# example.com
server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 其他SSL配置...
}

# api.example.com
server {
    listen 443 ssl http2;
    server_name api.example.com;

    ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

    # 其他SSL配置...
}

# 泛域名 *.app.example.com
server {
    listen 443 ssl http2;
    server_name .app.example.com;

    ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;

    # 其他SSL配置...
}

4.3 Apache 配置

启用SSL模块
# Ubuntu/Debian
sudo a2enmod ssl
sudo a2enmod headers

# CentOS/RHEL
sudo yum install mod_ssl
配置HTTPS站点
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

    # SSL配置
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite HIGH:!aNULL:!MD5

    # 安全头
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"

    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

# HTTP跳转HTTPS
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    Redirect permanent / https://example.com/
</VirtualHost>

4.4 测试SSL配置

# 测试Nginx配置
sudo nginx -t

# 重新加载Nginx
sudo systemctl reload nginx

# 测试Apache配置
sudo apachectl configtest

# 重新加载Apache
sudo systemctl reload httpd

在线测试工具:

  • https://www.ssllabs.com/ssltest/
  • https://https://www.cdn77.com/http-security-test

5. 证书续期

5.1 手动续期

# 测试续期(不实际续期)
sudo certbot renew --dry-run

# 手动续期(所有证书)
sudo certbot renew

# 续期指定证书
sudo certbot renew --cert-name example.com

# 强制续期(即使未到期)
sudo certbot renew --force-renewal

# 续期后执行命令
sudo certbot renew --post-hook "systemctl reload nginx"

5.2 自动续期配置

方法一:Cron 定时任务
# 编辑定时任务
sudo crontab -e

添加以下内容:

# 每天凌晨2点检查续期
0 2 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

# 或每周检查一次
0 2 * * 0 certbot renew --quiet --post-hook "systemctl reload nginx"

# 或每天多次检查
0 0,12 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

方法二:Systemd Timer(CentOS 8+/Ubuntu 20.04+)
# 启用certbot.timer(已自动安装)
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

# 查看定时器状态
sudo systemctl list-timers | grep certbot

# 手动触发
sudo systemctl start certbot.service

方法三:创建自定义定时器
# 创建服务文件
sudo nano /etc/systemd/system/certbot-renew.service
[Unit]
Description=Certbot Renewal

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
# 创建定时器文件
sudo nano /etc/systemd/system/certbot-renew.timer
[Unit]
Description=Certbot Renewal Timer

[Timer]
OnCalendar=daily
RandomizedDelaySec=1h
Persistent=true

[Install]
WantedBy=timers.target
# 启用并启动定时器
sudo systemctl enable certbot-renew.timer
sudo systemctl start certbot-renew.timer

5.3 续期钩子

# 续期前执行命令
sudo certbot renew --pre-hook "systemctl stop nginx"

# 续期后执行命令
sudo certbot renew --post-hook "systemctl start nginx"

# 续期成功后执行
sudo certbot renew --renew-hook "/path/to/script.sh"

# 组合使用
sudo certbot renew \
  --pre-hook "systemctl stop nginx" \
  --post-hook "systemctl start nginx" \
  --renew-hook "echo 'Certificate renewed' | mail -s 'SSL Certificate' admin@example.com"

5.4 配置续期参数

# 查看续期配置
sudo certbot certificates

# 编辑续期配置
sudo nano /etc/letsencrypt/renewal/example.com.conf

配置文件示例:

# renew_before_expiry = 30 days
version = 2.9.0
archive_dir = /etc/letsencrypt/archive/example.com
cert = /etc/letsencrypt/live/example.com/cert.pem
privkey = /etc/letsencrypt/live/example.com/privkey.pem
chain = /etc/letsencrypt/live/example.com/chain.pem
fullchain = /etc/letsencrypt/live/example.com/fullchain.pem

# Options used in the renewal process
[renewalparams]
account = abc123
authenticator = webroot
webroot_path = /var/www/html,
post_hook = systemctl reload nginx

6. 证书管理

6.1 查看证书

# 列出所有证书
sudo certbot certificates

# 查看证书详情
sudo certbot certificates --cert-name example.com

# 查看证书到期时间
sudo openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -dates

# 查看证书信息
sudo openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -text

输出示例:

Certificate Name: example.com
    Domains: example.com www.example.com
    Expiry Date: 2026-06-25 08:30:00+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem

6.2 撤销证书

# 撤销指定证书
sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem

# 撤销并删除证书
sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem --delete-after-revoke

# 撤销所有证书
sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem \
  --cert-path /etc/letsencrypt/live/api.example.com/cert.pem

6.3 删除证书

# 删除指定证书
sudo certbot delete --cert-name example.com

# 交互式删除
sudo certbot delete

# 删除后清理配置
sudo certbot delete --cert-name example.com --keep-until-expiring

6.4 导出证书

# 导出证书到指定目录
sudo certbot certificates --cert-name example.com

# 复制证书文件
sudo cp /etc/letsencrypt/live/example.com/fullchain.pem /path/to/backup/
sudo cp /etc/letsencrypt/live/example.com/privkey.pem /path/to/backup/

6.5 备份证书

# 创建备份目录
sudo mkdir -p /backup/letsencrypt

# 备份所有证书
sudo tar -czf /backup/letsencrypt/certificates-$(date +%Y%m%d).tar.gz /etc/letsencrypt/

# 或使用rsync同步
sudo rsync -avz /etc/letsencrypt/ /backup/letsencrypt/

7. 高级配置

7.1 配置文件位置

/etc/letsencrypt/
├── accounts/                  # 账户信息
├── archive/                   # 证书历史版本
├── live/                      # 当前证书(符号链接)
├── renewal/                   # 续期配置
├── cli.ini                    # 全局配置文件
└── options-ssl-nginx.conf     # Nginx SSL配置模板

7.2 全局配置

# 编辑全局配置
sudo nano /etc/letsencrypt/cli.ini

配置示例:

# 配置邮箱
email = admin@example.com

# 同意服务条款
agree-tos = True

# 自动续期
no-eff-email = True

# 默认验证方式
authenticator = webroot
webroot-path = /var/www/html

# 续期钩子
post-hook = systemctl reload nginx

# 密钥强度
rsa-key-size = 4096

7.3 更改密钥大小

# 申请时指定密钥大小(默认2048)
sudo certbot certonly --webroot -d example.com --rsa-key-size 4096

# 使用ECDSA密钥
sudo certbot certonly --webroot -d example.com --key-type ecdsa

# 指定ECC曲线
sudo certbot certonly --webroot -d example.com --key-type ecdsa --elliptic-curve secp256r1

7.4 限制重试次数

# 编辑续期配置
sudo nano /etc/letsencrypt/renewal/example.com.conf

添加:

[renewalparams]
max_log_backups = 5
authenticator = webroot

7.5 使用Staging测试环境

# 测试环境不会限制申请次数
sudo certbot certonly --webroot -d example.com --staging

# 生产环境
sudo certbot certonly --webroot -d example.com

7.6 日志管理

# 查看日志
sudo cat /var/log/letsencrypt/letsencrypt.log

# 清理旧日志
sudo find /var/log/letsencrypt -name "*.log" -mtime +30 -delete

# 限制日志大小
sudo nano /etc/logrotate.d/letsencrypt
/var/log/letsencrypt/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0640 root root
}

8. 常见问题

8.1 80端口被占用

# 查看占用80端口的进程
sudo netstat -tlnp | grep :80
sudo lsof -i :80

# 停止占用进程后重新申请
sudo systemctl stop nginx
sudo certbot certonly --standalone -d example.com
sudo systemctl start nginx

8.2 域名未解析到服务器

# 检查DNS解析
nslookup example.com
dig example.com
host example.com

# 确保A记录指向服务器IP
# 等待DNS生效(通常1-24小时,最快5分钟)

8.3 续期失败

# 查看续期日志
sudo cat /var/log/letsencrypt/letsencrypt.log | tail -100

# 手动测试续期
sudo certbot renew --dry-run --force-renewal

# 检查续期配置
sudo certbot certificates

# 强制续期
sudo certbot renew --force-renewal

常见失败原因:

  • 80端口被占用
  • 域名未解析
  • 防火墙阻止80端口
  • Webroot路径错误
  • DNS TXT记录未生效

8.4 证书到期未续期

# 手动续期
sudo certbot renew

# 强制续期
sudo certbot renew --force-renewal

# 重新申请
sudo certbot certonly --webroot -d example.com --force-renewal

8.5 权限问题

# 修改证书目录权限
sudo chmod 755 /etc/letsencrypt/live
sudo chmod 755 /etc/letsencrypt/live/example.com

# 修改证书文件权限
sudo chmod 644 /etc/letsencrypt/live/example.com/fullchain.pem
sudo chmod 600 /etc/letsencrypt/live/example.com/privkey.pem

# Nginx用户读取权限
sudo chown -R nginx:nginx /etc/letsencrypt/live/

8.6 速率限制

Let’s Encrypt 限制:

  • 5次/小时:每个域名
  • 50次/天:每个注册账户
  • 300次/周:每个注册账户
# 遇到限制时使用测试环境
sudo certbot certonly --webroot -d example.com --staging

# 或等待限制重置(通常是1小时)

8.7 证书不信任

# 检查证书链
openssl s_client -connect example.com:443 -servername example.com

# 确保使用fullchain.pem而非cert.pem
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

# 重新加载配置
sudo systemctl reload nginx

9. 最佳实践

9.1 安全建议

必须做

  • 使用最新版本 Certbot
  • 启用自动续期
  • 配置 HSTS 头
  • 禁用不安全的协议(SSLv2/SSLv3/TLSv1.0/TLSv1.1)
  • 定期检查证书有效期
  • 备份证书和配置

避免

  • 手动管理续期
  • 使用弱加密套件
  • 忽略续期失败
  • 泄露私钥文件

9.2 性能优化

# 启用HTTP/2
listen 443 ssl http2;

# SSL会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

# 启用OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;

# 调整缓冲区
ssl_buffer_size 4k;

9.3 监控告警

# 创建监控脚本
cat > /usr/local/bin/check-ssl.sh << 'EOF'
#!/bin/bash
DOMAINS=("example.com" "api.example.com")
ALERT_DAYS=30
ALERT_EMAIL="admin@example.com"

for domain in "${DOMAINS[@]}"; do
  expiry=$(echo | openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -dates | grep notAfter | cut -d= -f2)
  expiry_date=$(date -d "$expiry" +%s)
  current_date=$(date +%s)
  days_left=$(( (expiry_date - current_date) / 86400 ))

  if [ $days_left -lt $ALERT_DAYS ]; then
    echo "Certificate for $domain expires in $days_left days" | mail -s "SSL Certificate Alert" $ALERT_EMAIL
  fi
done
EOF

chmod +x /usr/local/bin/check-ssl.sh

# 添加到定时任务
crontab -e
# 添加:0 9 * * * /usr/local/bin/check-ssl.sh

9.4 自动化部署脚本

#!/bin/bash
# ssl-automate.sh

DOMAIN="example.com"
EMAIL="admin@example.com"
WEBROOT="/var/www/html"

# 申请证书
sudo certbot certonly --webroot \
  -w $WEBROOT \
  -d $DOMAIN \
  -d www.$DOMAIN \
  --email $EMAIL \
  --agree-tos \
  --non-interactive

# 配置Nginx
cat > /etc/nginx/sites-available/$DOMAIN << 'EOF'
server {
    listen 443 ssl http2;
    server_name DOMAIN;

    ssl_certificate /etc/letsencrypt/live/DOMAIN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/DOMAIN/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /var/www/html;
    index index.html;
}

server {
    listen 80;
    server_name DOMAIN;
    return 301 https://DOMAIN$request_uri;
}
EOF

# 替换域名
sed -i "s/DOMAIN/$DOMAIN/g" /etc/nginx/sites-available/$DOMAIN

# 启用配置
sudo ln -s /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/

# 测试并重载
sudo nginx -t && sudo systemctl reload nginx

# 设置自动续期
echo "0 2 * * * certbot renew --quiet --post-hook 'systemctl reload nginx'" | sudo crontab -

echo "SSL配置完成!"

9.5 检查清单

部署SSL证书后检查:

  • 证书成功申请
  • Nginx/Apache配置正确
  • HTTPS可访问
  • HTTP自动跳转HTTPS
  • SSL测试评分A+(https://www.ssllabs.com/ssltest/)
  • 自动续期配置成功
  • 续期测试通过(certbot renew --dry-run
  • 安全头配置正确
  • 监控告警配置完成
  • 证书备份完成

附录

A. 速查命令

# 安装
sudo apt install certbot

# 申请(standalone)
sudo certbot certonly --standalone -d example.com

# 申请(webroot)
sudo certbot certonly --webroot -w /var/www/html -d example.com

# 申请(nginx自动配置)
sudo certbot --nginx -d example.com

# 查看证书
sudo certbot certificates

# 测试续期
sudo certbot renew --dry-run

# 设置自动续期
crontab -e
# 0 2 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

# 撤销证书
sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem

# 删除证书
sudo certbot delete --cert-name example.com

B. 常用端口

协议 端口 用途
HTTP 80 Web访问
HTTPS 443 SSL加密访问
DNS 53 DNS解析

C. 有用链接


版本:1.0
更新日期:2026-03-25

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐