网站支持HTTPS协议访问,服务器定时自动更新安装免费SSL证书教程
背景
为了使网站更加安全,目前越来越多的网站都支持了HTTPS协议,SSL证书是HTTPS协议请求过程中最关键的内容。目前市面上SSL证书的类型众多,有免费版本和付费版本,付费版本是花钱获取便捷服务,免费版本的SSL(Let's Encrypt SSL )证书获取安装步骤比较繁琐,而且有效期也越来越短(之前还能申请1年的,现在只能申请3个月)。
之前写过一篇「全图文详细记录安装 免费SSL证书」的教程,但是整个安装流程都是手动操作的。本文将记录如何定时检查SSL证书有效期,并且能够自动更新安装SSL证书。
详细步骤
本文基于 Contos服务器,使用 acme.sh 工具实现SSL证书安装与自动更新。如果对acme.sh感兴趣的小伙伴可以访问githubhttps://github.com/acmesh-official/acme.sh
-
下载安装 acme.sh
bashcurl <https://get.acme.sh> | sh 或者 wget -O - <https://get.acme.sh> | sh
下载完成后会自动进行安装在
~/.acme.sh/
目录。可参考执行流程bash[root@VM-4-2-centos auto-certs]# curl <https://get.acme.sh> | sh % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1032 0 1032 0 0 415 0 --:--:-- 0:00:02 --:--:-- 415 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 215k 100 215k 0 0 16682 0 0:00:13 0:00:13 --:--:-- 21453 [2023年 06月 19日 星期一 23:07:32 CST] Installing from online archive. [2023年 06月 19日 星期一 23:07:32 CST] Downloading <https://github.com/acmesh-official/acme.sh/archive/master.tar.gz> [2023年 06月 19日 星期一 23:07:41 CST] Extracting master.tar.gz [2023年 06月 19日 星期一 23:07:41 CST] It is recommended to install socat first. [2023年 06月 19日 星期一 23:07:41 CST] We use socat for standalone server if you use standalone mode. [2023年 06月 19日 星期一 23:07:41 CST] If you don't use standalone mode, just ignore this warning. [2023年 06月 19日 星期一 23:07:41 CST] Installing to /root/.acme.sh [2023年 06月 19日 星期一 23:07:41 CST] Installed to /root/.acme.sh/acme.sh [2023年 06月 19日 星期一 23:07:41 CST] Installing alias to '/root/.bashrc' [2023年 06月 19日 星期一 23:07:41 CST] OK, Close and reopen your terminal to start using acme.sh [2023年 06月 19日 星期一 23:07:41 CST] Installing alias to '/root/.cshrc' [2023年 06月 19日 星期一 23:07:41 CST] Installing alias to '/root/.tcshrc' [2023年 06月 19日 星期一 23:07:41 CST] Installing cron job [2023年 06月 19日 星期一 23:07:41 CST] Good, bash is found, so change the shebang to use bash as preferred. [2023年 06月 19日 星期一 23:07:44 CST] OK [2023年 06月 19日 星期一 23:07:44 CST] Install success!
【如果上述步骤成功执行,忽略这里的步骤】由于acme.sh下载地址在国外,国内用户可能会出现下载超时的情况,下面介绍通过从gitee上下载安装包的安装方式
bashgit clone <https://gitee.com/neilpang/acme.sh.git> cd acme.sh
现在即可运行 acme.sh 脚本了,记住这个git包下载位置,后续执行脚本需要切换到这个目录下
-
【非必要】给脚本设置别名
因为不同的安装方式,acme.sh的执行路径不一致,我们可以将脚本设置别名,后续acme.sh相关的执行都直接使用 acme.sh执行即可
bashalias acme.sh= ~/.acme.sh/acme.sh
bash// git安装方式 alias acme.sh= git文件地址/acme.sh 例如我通过git下载到服务器的/soft目录 alias acme.sh=/soft/acme.sh/acme.sh
-
acme.sh 用户账号注册
bashsudo ~/.acme.sh/acme.sh --register-account -m email@expmple.com
执行效果
bash[root@VM-4-2-centos .acme.sh]# sudo ~/.acme.sh/acme.sh --register-account -m 1025534801@qq.com [2023年 06月 19日 星期一 23:42:55 CST] No EAB credentials found for ZeroSSL, let's get one [2023年 06月 19日 星期一 23:42:58 CST] Registering account: <https://acme.zerossl.com/v2/DV90> [2023年 06月 19日 星期一 23:43:01 CST] Registered [2023年 06月 19日 星期一 23:43:01 CST] ACCOUNT_THUMBPRINT='wqj1IcdhIATpxcUBBKNPGHGDziNWCCtY7-9of6_59Qo'
-
【非必要】使用
sestatus
命令检查服务器上是否启动 SELinuxacme.sh
可能与 SELinux 不兼容,建议在执行acme.sh过程中先关闭 SeLinuxbashsestatus
如果 SELinux 处于启用状态,输出结果中会显示
SELinux status: enabled
bash// 关闭SELinux sudo setenforce 0 // 恢复打开SELinux sudo setenforce
-
生成网站域名对应的SSL证书
执行下方命令生成证书,将
yourdomain.com
替换为你的实际域名。为了避免出现权限问题,使用root权限进行命令执行。 通过 -d 可以同时生成多个域名证书。bashsudo ~/.acme.sh/acme.sh --issue --ecc --nginx -d yourdomain.cn -d sub.yourdomain.com //例如我给自己的网站www.levenx.com生成证书 acme.sh --issue --ecc --nginx -d www.levenx.com
-
安装SSL证书
通过步骤3生成证书后,需要将证书按照到服务器中,其中
--key-file
是安装SSL的key(可以自定义你想要的名字),--fullchain-fille
是完整的证书地址(可以自定义你想要的名字)bashsudo ~/.acme.sh/acme.sh --install-cert -d yourdomain.com --key-file /etc/nginx/certs/yourdomain.com.key --fullchain-file /etc/nginx/certs/fullchain.cer --reloadcmd "sudo nginx -s reload" //例如安装www.levenx.com证书 acme.sh --install-cert -d www.levenx.com --key-file /etc/nginx/certs/www.levenx.com.key --fullchain-file /etc/nginx/certs/www.levenxcom.cer --reloadcmd "sudo nginx -s reload"
-
修改Nginx服务器SSL证书配置
bashserver { listen 443 ssl; server_name yourdomain.com www.yourdomain.com; ssl_certificate /etc/nginx/certs/fullchain.cer; ssl_certificate_key /etc/nginx/certs/yourdomain.com.key; #... 其他配置项 ... }
更新文件并重新加载你的 Nginx 服务器,尝试通过HTTPS协议访问你的网站,不出意外应该是成功的。
上述步骤执行完成,你的网站的SSL证书已经配置完成。但是证书的有效期只有3个月,每次都需要执行命令更新SSL证书是非常繁琐的,如果你有多个域名,那么这个工作量是直接翻倍的。
如果想一劳永逸,可以参考步骤6,开启证书到期自动更新定时。
-
开启证书到期自动更新定时任务
acme.sh 提供了定时检查SSL证书有效期并自动更新的脚本,需要配置crontab定时工具使用
bashacme.sh --cron
执行效果
bash[root@iZwz97uafclgkz8pcgkj0jZ .acme.sh]# acme.sh --cron [2023年 06月 21日 星期三 16:37:57 CST] ===Starting cron=== [2023年 06月 21日 星期三 16:37:57 CST] Renew: 'levenx.com' [2023年 06月 21日 星期三 16:37:57 CST] Renew to Le_API=https://acme.zerossl.com/v2/DV90 [2023年 06月 21日 星期三 16:37:57 CST] Skip, Next renewal time is: 2023-08-20T08:26:48Z [2023年 06月 21日 星期三 16:37:57 CST] Add '--force' to force to renew. [2023年 06月 21日 星期三 16:37:57 CST] Skipped levenx.com [2023年 06月 21日 星期三 16:37:57 CST] Renew: 'www.levenx.com' [2023年 06月 21日 星期三 16:37:57 CST] Renew to Le_API=https://acme.zerossl.com/v2/DV90 [2023年 06月 21日 星期三 16:37:58 CST] Skip, Next renewal time is: 2023-08-20T08:19:44Z [2023年 06月 21日 星期三 16:37:58 CST] Add '--force' to force to renew. [2023年 06月 21日 星期三 16:37:58 CST] Skipped www.levenx.com [2023年 06月 21日 星期三 16:37:58 CST] ===End cron===
设置每隔30天运行一次的定时任务
bash0 0 1 * * /bin/bash -i -c 'acme.sh --cron --home "/root/.acme.sh"' > /var/log/acme_cron.log 2>&1
通过 tail -f acme_cron.log
查询定时任务执行情况
bash[root@iZwz97uafclgkz8pcgkj0jZ log]# tail -f acme_cron.log [Wed Jun 21 16:54:01 CST 2023] Renew to Le_API=https://acme.zerossl.com/v2/DV90 [Wed Jun 21 16:54:01 CST 2023] Skip, Next renewal time is: 2023-08-20T08:26:48Z [Wed Jun 21 16:54:01 CST 2023] Add '--force' to force to renew. [Wed Jun 21 16:54:01 CST 2023] Skipped levenx.com [Wed Jun 21 16:54:01 CST 2023] Renew: 'www.levenx.com' [Wed Jun 21 16:54:01 CST 2023] Renew to Le_API=https://acme.zerossl.com/v2/DV90 [Wed Jun 21 16:54:01 CST 2023] Skip, Next renewal time is: 2023-08-20T08:19:44Z [Wed Jun 21 16:54:01 CST 2023] Add '--force' to force to renew. [Wed Jun 21 16:54:01 CST 2023] Skipped www.levenx.com [Wed Jun 21 16:54:01 CST 2023] ===End cron===
总结
通过技术解决重复劳动是程序员的使命,希望我们不忘初心,一往无前。
本教程是博主亲身操作流程的记录,希望对大家有所帮助。如果对你有帮助,麻烦给博主点个赞~🙏