先说一下方法,这是基于GitHub开源项目acme.sh与Let's Encrypt无需注册自动更新免费泛域名https证书。
一、使用ACME的原因
在国内购买云服务器,基本上都可以通过云平台进而申请,但是自2024年之后大部分的厂商能够申请到的证书只有90天的有效期。
阿里云:
腾讯云:
于是,进入我们今天的正篇,如何免费并永久的申请ssl证书。
二、安装ACME
准备好一台云服务器以及备案后的域名。
首先输入下面命令安装acme脚本,我安装的位置为/root/acme/目录下,实际应该是随意位置,避免出现其他麻烦,可以参考我的安装位置。
curl https://get.acme.sh | sh
安装成功后的界面:
输入下面命令,修改acme的默认ca为Let’s Encryp
acme.sh --set-default-ca --server letsencrypt
三、获取DNS API
我购买的是阿里云,其他厂商的应该也大差不差,只要能够Id和Secret 就行了。
以下是阿里云的获取流程,非阿里云服务器的小伙伴可以跳过这部分。
不过,我这里由于创建过用户,如果你是第一次开通,并且没有开通子账户,则直接按照提示进行下一步即可。
选择用户,创建用户,勾选使用永久Accesskey访问。
接下来保存有关的id和secret,一定要记住其中的 AccessID 和 AccessKeySecret ,脚本中要填写的也就是这两个值。
选择用户,选择添加权限
搜索dns,添加管理dns权限
四、配置API
export Ali_Key="<key>"
export Ali_Secret="<secret>"
输入命令,修改 .bashrc 文件,把上面脚本代码输入进去
vim ~/.bashrc
内容展示:
使用命令i,编写
Esc退出编写
:wq退出保存
保存后重新加载文件
source ~/.bashrc
五、生成泛域名证书
输入下面命令,生成泛域名证书
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
成功后界面:
其中证书文件 fullchain.cer 密钥文件 forminio.cn.key
六、复制证书
我使用的是docker安装的最新版nginx,找到nginx的挂载的配置文件夹/root/nginx/conf/,进入检查是否有ssl文件夹,根据不同版本的nginx进行调整,输入以下命令
acme.sh --install-cert -d example.com \
--key-file /修改为你的配置路径/nginx/conf/ssl/example.com.key \
--fullchain-file /修改为你的配置路径/nginx/conf/ssl/fullchain.cer \
--reloadcmd "docker restart nginx"
非docker安装nginx,则:
--reloadcmd "service nginx reload"
更多复制证书方式,请参考官方中文说明文档
七、配置Nginx
在nginx.conf中定位到server属性配置。(vim中,使用“/”输入文本可以用于定位),如果(新版)初始化没有注释掉的模板server字段也可以自己输入,注意开放443端口,一般默认放开
server {
#HTTPS的默认访问端口443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
listen 443 ssl;
#填写证书绑定的域名
server_name <yourdomain>;
#填写证书文件绝对路径
ssl_certificate /path/to/fullchain/nginx/cert.pem
#填写证书私钥文件绝对路径
ssl_certificate_key /path/to/keyfile/in/nginx/key.pem
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
#表示优先使用服务端加密套件。默认开启
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
同时注意,如果是docker安装的nginx,注意nginx需要映射443端口,则需要修改为
#填写证书文件绝对路径
ssl_certificate /etc/nginx/ssl/<cert-file-name>.pem;
#填写证书私钥文件绝对路径
ssl_certificate_key /etc/nginx/ssl/<cert-file-name>.key;
若未映射443端口则使用docker命令容器后,再部署
docker rm nginx
部署命令
docker run -d \
-p 80:80 \
-p 443:443 \
--name nginx \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/logs:/var/log/nginx \
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \ # 只挂载配置文件
-v /root/nginx/conf/ssl:/etc/nginx/ssl:ro \ # 单独挂载证书
nginx
若已经映射443端口,则重启nginx命令
docker restart nginx
证书的部署完毕,可以输入https://域名 访问,验证是否能够通过。
参考我的博客
以下是维护部分,小伙伴们可以选择性观看。
八、查看已安装证书信息
acme.sh --info -d example.com
会输出以下信息:
DOMAIN_CONF=/root/.acme.sh/example.com/example.com.conf
Le_Domain=example.com
Le_Alt=no
Le_Webroot=dns_ali
Le_PreHook=
Le_PostHook=
Le_RenewHook=
Le_API=https://acme-v02.api.letsencrypt.org/directory
Le_Keylength=
Le_OrderFinalize=https://acme-v02.api.letsencrypt.org/acme/finalize/23xxxx150/781xxxx4310
Le_LinkOrder=https://acme-v02.api.letsencrypt.org/acme/order/233xxx150/781xxxx4310
Le_LinkCert=https://acme-v02.api.letsencrypt.org/acme/cert/04cbd28xxxxxx349ecaea8d07
Le_CertCreateTime=1649358725
Le_CertCreateTimeStr=Thu Apr 7 19:12:05 UTC 2022
Le_NextRenewTimeStr=Mon Jun 6 19:12:05 UTC 2022
Le_NextRenewTime=1654456325
Le_RealCertPath=
Le_RealCACertPath=
Le_RealKeyPath=/etc/acme/example.com/privkey.pem
Le_ReloadCmd=service nginx force-reload
Le_RealFullChainPath=/etc/acme/example.com/chain.pem
九、更新证书
目前证书每 60 天自动更新,你无需任何操作。
但是你也可以强制续签证书:
acme.sh --renew -d example.com --force
查看定时任务
crontab -l
应该包含:
0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
十、ACME出错
如果出错,请添加 --debug
参数输出详细的调试信息:
acme.sh --issue ..... --debug
或者输出更详细的信息:
acme.sh --issue ..... --debug 2
请参考:https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh