● 对证书续期和错误等有cron job通知
# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)国内可以参考https://github.com/acmesh-official/acme.sh/wiki/Install-in-China这个安装步骤,为方便起见,都是以root权限的用户来执行
# 堆代码 duidaima.com # git clone https://gitee.com/neilpang/acme.sh.git # cd acme.sh # ./acme.sh --install -m my@example.com这里my@example.com写自己的邮箱即可,推荐是自己常用的
[Fri Jun 14 11:25:25 CST 2024] It is recommended to install socat first. [Fri Jun 14 11:25:25 CST 2024] We use socat for standalone server if you use standalone mode. [Fri Jun 14 11:25:25 CST 2024] If you don't use standalone mode, just ignore this warning. [Fri Jun 14 11:25:25 CST 2024] Installing to /root/.acme.sh [Fri Jun 14 11:25:25 CST 2024] Installed to /root/.acme.sh/acme.sh [Fri Jun 14 11:25:25 CST 2024] Installing alias to '/root/.bashrc' [Fri Jun 14 11:25:25 CST 2024] OK, Close and reopen your terminal to start using acme.sh [Fri Jun 14 11:25:25 CST 2024] Installing alias to '/root/.cshrc' [Fri Jun 14 11:25:25 CST 2024] Installing alias to '/root/.tcshrc' [Fri Jun 14 11:25:25 CST 2024] Installing cron job [Fri Jun 14 11:25:25 CST 2024] Good, bash is found, so change the shebang to use bash as preferred. [Fri Jun 14 11:25:25 CST 2024] OK这就ok了,但它推荐我们装一下socat,那我们就装一下
# yum install socat新版acme.sh使用ZeroSSL作为CA,我们这边切换到Let’s Encrypt的CA:
# acme.sh --set-default-ca --server letsencrypt安装好acme.sh后,会自动为我们创建cronjob,每天会自动检测所有的证书,如果快过期了, 需要更新, 则会自动更新证书
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &' 25 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null定时任务保证了证书在到期前能自动续期;且安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/
# acme.sh --upgrade --auto-upgrade
# acme.sh --issue -d 域名 --nginx # or --apache2.如果你的服务器上已经运行了web软件,指定webroot即可签发证书
# acme.sh --issue -d 域名 --webroot web目录3.如果没有运行web软件并且80端口空闲,可以使用acme.sh自己监听80端口进行验证
# acme.sh --issue -d 域名 --standalone4.使用DNS方式,手动在域名上添加一条 txt 解析记录, 验证域名所有权;或者拿到DNS运营商账号的秘钥,自动执行DNS运营商的插件
# acme.sh --issue --dns -d 域名 #命令结束后,acme.sh会显示解析记录,需要手动到DNS后台设置解析由于笔者的小破站是通过Nginx来反向代理的,本来这里直接选用第一个
# acme.sh --issue -d 你的域名(tmp.xxxx.cn) --nginx /etc/nginx/nginx.conf但我这个域名是子域名,服务还在容器里面,所以acme无法直接访问这个域名下的文件,笔者这里只能采用第4个方案,域名DNS运营商是腾讯云,不想手动到DNS后台设置解析的话,这里需要腾讯云的秘钥
{ "statement": [ { "action": [ "dnspod:DescribeRecordFilterList", "dnspod:DescribeRecordList", "dnspod:CreateRecord", "dnspod:DeleteRecord" ], "effect": "allow", "resource": [ "*" ] } ], "version": "2.0" }腾讯云创建子账号,再创建一个子账号,选择 编程访问+名为policygen-20240614230651的策略
export Tencent_SecretId="<Your SecretId>" export Tencent_SecretKey="<Your SecretKey>"以下方式是环境变量永久生效,vim /etc/profile,添加以下内容:
export Tencent_SecretId="<Your SecretId>" export Tencent_SecretKey="<Your SecretKey>"保存,并source /etc/profile命令,重新加载环境变量
acme.sh --issue --dns dns_tencent -d example.com -d *.example.com最终生成的证书/root/.acme.sh/example.com_ecc/fullchain.cer,除了腾讯云,acme.sh目前支持 阿里云, cloudflare, dnspod, cloudxns, godaddy等数十种解析商的自动集成。
acme.sh --install-cert -d example.com \ --key-file /root/myAcmeSSL/example.com/key.pem \ --fullchain-file /root/myAcmeSSL/example.com/cert.pem \ --reloadcmd "nginx -s stop && nginx" --install-cert: 安装证书的命令 -d example.com:读取对应域名配置 –key-file:将证书私钥拷贝到该参数指定的路径 –fullchain-file:将证书链拷贝到该参数指定的路径 –reloadcmd:指定证书拷贝到对应目录后执行的命令nginx -s stop && nginx这是我本机上的命令这样能够重新加载证书;如果service命令正常,也可以运行service nginx force-reload;
# 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 2024 Le_NextRenewTimeStr=Mon Jun 6 19:12:05 UTC 2024 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修改nginx.conf
server { listen 443 ssl; server_name example.com; # 请替换为证书实际路径 ssl_certificate /root/myAcmeSSL/example.com/cert.pem; ssl_certificate_key /root/myAcmeSSL/example.com/key.pem; # ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM; ssl_prefer_server_ciphers on; // location / { // ... // } }这样接下来就可以验证域名了,别忘了防火墙443端口还是要开的。每天0点25分,会检测证书是否过期,如果快过期了或需要更新, 则会自动更新证书,无需我们再操心了!
acme.sh --renew -d example.com --force停止证书续期
acme.sh --remove -d example.comacme.sh申请免费的SSL证书并自动续签,总体上使用起来是比较简单,轻便的,非常适合个人开发者~