Let’s Encrypt免费SSL证书申请

Let’s Encrypt是目前最主流的免费SSL证书提供商,证书有效期为90天,支持自动续期。我用它给个人网站和雨云服务器上的应用都配过HTTPS,没花过一分钱。下面直接说怎么搞。 环境准备 服务器需要能通过80或443端口对外访问,因为Let’s Encrypt在签发证书时要验证域名所有权。操作系统不限,我拿Ubuntu 22.04举例,CentOS/RHEL把apt换成yum就行。 安装Certbot客户端,这是Let’s Encrypt官方推荐的工具:
sudo apt update
sudo apt install certbot
单域名证书申请 假设你的域名是example.com,网站根目录在/var/www/html,用以下命令:
sudo certbot certonly --webroot -w /var/www/html -d example.com
certonly表示只获取证书,不自动配置Web服务器。–webroot指定通过webroot方式验证,-w后面跟网站根目录,-d后面跟域名。 执行后Certbot会在/var/www/html/.well-known/acme-challenge/下创建临时文件,Let’s Encrypt服务器会通过HTTP访问这个文件来验证你确实拥有该域名。验证通过后证书会保存在:
/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem
多域名或通配符证书 如果需要一张证书覆盖多个域名或子域名,比如example.com和www.example.com,或者*.example.com,用DNS验证方式:
sudo certbot certonly --manual --preferred-challenges dns -d example.com -d "*.example.com"
–manual表示手动操作,–preferred-challenges dns指定用DNS验证。执行后会让你去DNS管理面板添加一条TXT记录,记录名是_acme-challenge.example.com,值是一串随机字符串。添加后等几分钟让DNS生效,回车继续。 通配符证书只能用DNS验证,因为webroot方式没法验证.example.com这种泛域名。如果你的DNS托管商有API,可以用certbot-dns-插件实现全自动,比如certbot-dns-cloudflare、certbot-dns-aliyun等,省去手动加TXT记录的步骤。 配置Nginx 拿到证书后配置Nginx的SSL部分:
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;

    # 推荐的安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

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

# HTTP自动跳转HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}
检查配置是否正确:
sudo nginx -t
sudo systemctl reload nginx
自动续期 证书90天过期,提前30天可以续期。Certbot自带续期命令:
sudo certbot renew
这个命令会检查所有通过Certbot申请的证书,如果距离过期不足30天就自动续期。配合crontab实现定时任务,每天执行两次:
sudo crontab -e
添加一行:
0 0,12 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
–quiet表示不输出日志,–post-hook指定续期成功后重载Nginx使新证书生效。每天跑两次是因为Let’s Encrypt有时会在续期窗口内随机失败,多跑几次提高成功率。 验证 用浏览器访问https://example.com,看地址栏有没有锁图标。也可以用命令行:
curl -I https://example.com
返回200且没有证书错误就行。查看证书到期时间:
sudo openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -dates
常见问题 申请时报”failed to connect to 443 port”:检查服务器防火墙是否放行了80和443端口。用ufw的话:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
续期时如果域名已经指向别的服务器,比如你的网站从雨云迁移到了其他云,但证书还在旧服务器上,renew会失败。解决办法是在新服务器上重新申请。 如果用了CDN或反向代理,确保验证请求能透传到后端服务器。比如Cloudflare要暂时关闭代理模式(橙色云朵变灰色),等证书申请成功后再打开。 小技巧 用–dry-run测试续期流程是否正常,不会真正修改证书:
sudo certbot renew --dry-run
查看所有已申请的证书列表:
sudo certbot certificates
要撤销证书:
sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem
我个人的习惯是给雨云服务器配好证书后,直接把crontab续期脚本写好,从此不用管HTTPS的事。90天一到自动续,浏览器永远显示安全连接。

雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容