Http升级Https使用Certbot申请证书并免费续期
前言
将项目中Http升级Https申请证书的使用到的技术和经验进行分享及记录。
为什么要用HTTPS
确保网站安全和隐私保护。它通过加密连接,防止数据在传输过程中被窃取或篡改。
Certbot是什么
Certbot是一款由电子前沿基金会(EFF)开发和维护的免费开源工具,旨在自动化配置和管理Linux、Apache及Nginx服务器上的SSL/TLS证书。它能够自动完成域名验证并安装证书,简化了安全证书的管理流程。
实战操作
安装Certbot
如果你的服务器上还没有安装 Certbot,可以通过以下命令安装:
sudo yum update
sudo yum install certbot
获取阿里云参数
获取 AccessKey ID 和 AccessKey Secret
注意: 创建后获取到 AccessKey ID 和 AccessKey Secret 后应立即保存, 页面关闭后就看不到了
获取地域ID
看服务器所属的地域: 云服务器管理控制台
搜索地域ID,会出来一个地域ID的帮助文档,找到对应的地域ID
安装 certbot-dns-aliyun
安装 aliyun cli 工具
wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
tar xzvf aliyun-cli-linux-latest-amd64.tgz
mv aliyun /usr/local/bin
配置凭证
号处填上上面获取到的 AccessKey ID,AccessKey Secret, 地域Id(region)
aliyun configure set --profile AkProfile --mode AK --access-key-id **** --access-key-secret **** --region ****
激活刚配置的凭证
aliyun ecs DescribeInstances --profile AkProfile
凭证保留位置: ~/.aliyun/
安装 certbot-dns-aliyun 插件
wget https://cdn.jsdelivr.net/gh/justjavac/certbot-dns-aliyun@main/alidns.sh
sudo mv alidns.sh /usr/local/bin
sudo chmod +x /usr/local/bin/alidns.sh
sudo ln -s /usr/local/bin/alidns.sh /usr/local/bin/alidns
申请证书
使用 Certbot 申请证书时,我们需要指定 DNS 挑战,并调用 alidns 脚本自动添加 DNS 记录。以下是申请证书的命令:
certbot certonly -d www.example.com --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
参数说明 - -d http://example.com:指定域名(可以指定多个域名)。 - manual:手动模式。 - preferred-challenges dns:使用 DNS 挑战。 - manual-auth-hook "alidns":在 DNS 挑战时调用 alidns 脚本。 - manual-cleanup-hook "alidns clean":在 DNS 挑战完成后调用 alidns clean 脚本。 - --dry-run:模拟续期过程,不会实际续期证书。正式申请时去掉--dry-run参数:
nginx配置文件
server {listen 80;server_name 11.22.com;# 将 HTTP 请求重定向到 HTTPSreturn 301 https://$host$request_uri;}server {listen 443 ssl;server_name 11.22.com;#ssl证书的pem文件路径ssl_certificate /etc/letsencrypt/live/11.22.com/fullchain.pem; # managed by Certbot#ssl证书的key文件路径ssl_certificate_key /etc/letsencrypt/live/11.22.com/privkey.pem; # managed by Certbotssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";location ^~/api {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_buffering off;rewrite ^/api/(.*)$ /$1 break;proxy_pass http://11.22.33.5:8200;}location / {root /usr/share/nginx/html/dist;index index.html;try_files $uri $uri/ /index.html;}}
设置自动续期
Certbot 默认会在证书到期前 30 天内自动续期。我们可以通过设置 cron 任务来实现自动化续期。
编辑 crontab
crontab -e
添加续期任务(每天凌晨 2:00 执行续期任务)
0 2 * * * certbot renew --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --deploy-hook "nginx -s reload" >> /var/log/certbot-renew.log 2>&1
参数说明 - 0 2 * :每天凌晨 2:00 执行任务。 - --quiet:静默模式,减少日志输出。 - --preferred-challenges dns:指定使用 DNS 挑战。 - --manual-auth-hook "alidns":在 DNS 挑战时调用 alidns 脚本。 - --manual-cleanup-hook "alidns clean":在 DNS 挑战完成后调用 alidns clean 脚本。 - --deploy-hook "nginx -s reload":在证书成功续期后重启 Nginx。 - >> /var/log/certbot-renew.log 2>&1:将日志输出到 /var/log/certbot-renew.log。
验证续期
手动测试续期
certbot renew --dry-run --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
检查证书状态
certbot certificates
常见问题排查
没有日志输出
如果 /var/log/certbot-renew.log 没有日志输出,可能是以下原因: 权限问题:确保日志文件可写:
sudo touch /var/log/certbot-renew.log
sudo chmod 644 /var/log/certbot-renew.log
cron 任务未执行:检查 cron 日志:
grep CRON /var/log/syslog
证书未到期
如果证书未到期,Certbot 会跳过续期。可以通过以下命令强制续期:
certbot renew --force-renewal --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
总结
通过 Certbot 和阿里云 DNS 的集成,我们可以轻松实现 SSL 证书的自动续期。只需设置一次 cron 任务,Certbot 就会在证书到期前自动续期,并调用 alidns 脚本处理 DNS 挑战。
原文借鉴:https://zhuanlan.zhihu.com/p/24453419814