在此之前ssl一直用的腾讯申请的,腾讯的证书不花钱只能单域名且有效期一年。虽然认证安全些但是我们普通开发者只是想要一个小锁而已,再加上最近证书有效期改成三个月,这样弄就麻烦了,所有花了一小点时间一劳永逸的解决了证书的事情。
只需要几步即可完成
1.安装acme
# 安装acme.sh
curl https://get.acme.sh | sh
source ~/.bashrc
2.腾讯云获取API密钥
- 登录腾讯云控制台
- 进入【访问管理】->【API密钥管理】
- 创建新密钥,获取SecretId和SecretKey(要确保有 QcloudDNSPodFullAccess 的全读写权限)
- 保存好这两个密钥,后面会用到
3.申请通配符证书
# 设置腾讯云API密钥
export DP_Id="你的SecretId"
export DP_Key="你的SecretKey"
# 切换CA,可选
acme.sh --set-default-ca --server letsencrypt
# 申请通配符证书
acme.sh --issue --dns dns_dp -d "*.yourdomain.com" -d "yourdomain.com"
4.部署证书
上面申请了证书只是把证书链放在了本地,没有生成对应的类似pem,crt的证书,并且也没有自动更新的功能,所以需要部署
# 创建证书目录(如果不存在)
mkdir -p /etc/nginx/ssl/
# 复制证书文件(acme.sh路径)
acme.sh --install-cert -d "yourdomain.com" \
--key-file /etc/nginx/ssl/yourdomain.com.key \
--fullchain-file /etc/nginx/ssl/yourdomain.com.crt \
--reloadcmd "systemctl reload nginx"
这样/etc/nginx/ssl下就有对应的key和crt文件,并且会自动更新了,自动更新可以查看定时任务
crontab -l | grep acme.sh
手动测试续期
# 测试续期(不实际更新)
acme.sh --renew -d yourdomain.com --force --test
# 实际续期
acme.sh --renew -d yourdomain.com --force
5.配置nginx
添加https的配置
# HTTPS主配置
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
# Let's Encrypt证书路径
ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
# SSL安全配置 - 符合Let's Encrypt最佳实践
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS头
add_header Strict-Transport-Security "max-age=63072000" always;
# 站点配置
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 用于证书续期验证
location ~ /\.well-known/acme-challenge {
root /usr/share/nginx/html;
allow all;
}
}
然后重启nginx
nginx -t && systemctl reload nginx
# 检查证书信息
openssl x509 -in /etc/nginx/ssl/yourdomain.com/fullchain.crt -noout -subject -dates
# 测试网站SSL
curl -I https://yourdomain.com
# 检查证书透明度日志(可选)
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com < /dev/null 2>/dev/null | openssl x509 -text | grep -A 10 "CT"



