最近要给一个雨云上的网站配HTTPS,用Let’s Encrypt搞定了。这东西免费、自动续期,不用给CA交钱。记录一下操作步骤和踩过的坑。
环境准备
一台能跑Linux的机器,我用的是Ubuntu 22.04。域名已经解析到服务器IP,80和443端口要放通。雨云的控制台安全组里配一下,不然acme验证过不去。
安装acme.sh
Let’s Encrypt官方推荐Certbot,但acme.sh更轻量,支持更多DNS API,自动续期也稳。一行命令:
curl https://get.acme.sh | sh -s email=你的邮箱@example.com
安装完会自动加到~/.bashrc,重开终端或source一下:
source ~/.bashrc
申请证书(HTTP验证)
最常用的方式,acme会往你的网站根目录放一个验证文件,Let’s Encrypt服务器来访问确认你拥有域名。
假设你的网站根目录在 /var/www/html,执行:
acme.sh --issue -d yourdomain.com -d www.yourdomain.com --webroot /var/www/html
-d后面可以跟多个域名,第一个是主域名。–webroot指定网站根目录,acme会自动创建.well-known目录。
等几十秒,看到”Cert success”就拿到了。证书文件在 ~/.acme.sh/yourdomain.com/ 下,fullchain.cer是证书链,yourdomain.com.key是私钥。
申请证书(DNS验证)
如果网站没跑在80端口,或者不想改webroot配置,用DNS方式。acme支持上百家DNS服务商的API,比如阿里云、腾讯云、Cloudflare。
以Cloudflare为例,先拿到API Token,:
export CF_Token="你的cloudflare_api_token"
export CF_Account_ID="你的account_id"
acme.sh --issue --dns dns_cf -d yourdomain.com -d *.yourdomain.com
这个方式能申请泛域名证书,*.yourdomain.com 可以覆盖所有子域名,爽。
安装证书到Nginx
拿到证书文件,复制到合适位置:
mkdir -p /etc/nginx/ssl
cp ~/.acme.sh/yourdomain.com/fullchain.cer /etc/nginx/ssl/
cp ~/.acme.sh/yourdomain.com/yourdomain.com.key /etc/nginx/ssl/
Nginx配置示例:
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
location / {
proxy_pass http://localhost:3000;
}
}
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
重载Nginx:
nginx -t && systemctl reload nginx
自动续期
acme.sh默认装了cron任务,每天检查证书是否快过期。Let’s Encrypt证书有效期90天,到期前30天自动续。确认一下:
crontab -l
应该能看到类似 “0 0 * /root/.acme.sh/acme.sh –cron –home /root/.acme.sh > /dev/null” 的行。
续期后如果Nginx没自动加载新证书,加个reload钩子:
acme.sh --install-cert -d yourdomain.com --reloadcmd "systemctl reload nginx"
踩坑记录
1. 申请失败最常见原因是端口没开。雨云上配安全组时,80和443都要放行,不然验证请求过不来。
2. 泛域名证书只能用DNS验证,HTTP验证不支持。
3. 证书文件权限要配好,Nginx用户要能读。我习惯把私钥设成600,证书644。
4. 如果用了CDN或反向代理,记得开启SSL透传,否则acme验证会失败。雨云的CDN节点默认支持,但需要手动开启”SSL回源”。
5. 旧版acme.sh升级命令:acme.sh –upgrade,不然可能遇到Let’s Encrypt的API变更。
验证效果
浏览器访问 https://yourdomain.com,小锁图标出来就对了。用openssl检查:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
能看到证书链和有效期,确认是Let’s Encrypt颁发的就没问题。
整个过程十分钟搞定。雨云上配好安全组,域名解析正常,剩下的就是跑几条命令。以后新项目加SSL,直接复制上面流程改域名就行。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容