【Linux】使用acme.sh实现免费生成SSL证书及自动续签之宝塔面板

发表于2024-10-29 17:44:35来源于网络收集整理

次点击[] [] [] [打印] [关闭窗口] [评论]

欢迎大家加入创想工作室QQ群 网络瘫痪上不了网?电脑出故障?找破解软件?加入创想工作室QQ群,向大神求助,一步解决问题!QQ群号码:326338868[点此获取更多QQ群]
现在市面上的免费SSL证书,无论是阿里云、百度云还是腾讯云,都把有效期从一年调整为三个月了,因此每次手动配置证书就很麻烦,刚好最近 Let’s Encrypt Authority 也由 X3 更新为了 R3 版本,使用了新的 OCSP 地址,解决了污染问题。因此本文为大家分享下借助 acme.sh 自动签发更新证书,官方有很详细的使用文档,这里只做简单记录。
 
本人的测试环境为:CentOS系统+宝塔面板+Apache
 
下面正式开始吧~~
 

关于Let's Encrypt 免费SSL证书

 
Let's Encrypt 作为一个公共且免费 SSL 的项目逐渐被广大用户传播和使用,是由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等组织人员发起,主要的目的也是为了推进网站从 HTTP 向 HTTPS 过度的进程,目前已经有越来越多的商家加入和赞助支持。
 
Let's Encrypt 签发的证书有效期只有90天,甚至希望缩短到60天。有效期越短,泄密后可供监控的窗口就越短。为了支撑这么短的有效期,就必须自动化验证和签发。因为自动化了,长远而言,维护反而比手动申请再安装要简单。
 
下面我们就具体的讲述一下利用 Let's Encrypt 的 ACME 协议在服务器上运用 acme.sh 脚本来申请、管理 SSL 证书(这里要强调一下的是 Let's Encrypt 的 SSL 证书申请是必须要有服务器 root 权限的哦,也就是说必须是 VPS(云主机)才可以的,虚拟主机上是无法申请获取的,但是可以在 VPS(云主机)上申请后部署到虚拟主机上)。
 
 

一、安装 acme.sh

 
acme.sh 是一个实现了 ACME 客户端协议的 Bash 脚本,可以从 Let's Encrypt 生成免费的证书。如果你的服务器已安装,可以用命令 acme.sh -v 查看版本号。安装方式十分简单,执行下面的命令即可:
 
curl https://get.acme.sh | sh -s email=my@example.com
# 或者
wget -O - https://get.acme.sh | sh -s email=my@example.com
 
把 my@example.com 改成自己的邮箱。安装成功后,会为你自动创建定时任务,如果快过期了需要更新,则会自动更新证书。
 
普通用户和 root 用户都可以安装使用,安装过程进行了以下几步:
 
把 acme.sh 安装到你的 root 目录(普通用户的话则是 home 目录)下的 ~/.acme.sh/ ,并创建 一个 shell 的 alias(即别名)方便你的使用:alias acme.sh=~/.acme.sh/acme.sh ,并自动为你创建 cronjob定时任务,每天 0:00 点自动检测所有的证书, 如果快过期了需要更新, 则会自动更新证书(默认情况下,证书将每60天更新一次)。安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中: ~/.acme.sh/
 
更换默认证书 CA 提供商
 
目前acme.sh 支持 Let’s Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA,默认使用 ZeroSSL,而在我本人实际使用中发现ZeroSSL似乎不太喜欢国内的网络环境,而Let's Encrypt却完全能够承受,那我们先换个CA再说吧,使用下面命令更换(推荐大家改默认为letsencrypt):
 
#切换 Let's Encrypt
acme.sh --set-default-ca --server letsencrypt
#切换 Buypass
acme.sh --set-default-ca --server buypass
#切换 ZeroSSL
acme.sh --set-default-ca --server zerossl
#切换 SSL.com
acme.sh --set-default-ca --server ssl.com
#切换 Google Public CA
acme.sh --set-default-ca --server google
 

二、验证及生成证书

 
acme.sh 实现了 acme 协议支持的所有验证协议,一般有两种方式验证: http 和 dns 验证(本文为大家介绍第一种http文件验证方式)。
 
http 方式需要在你的网站根目录下放置一个文件来验证你的域名所有权,完成验证后就可以生成证书了。
 
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
 
只需要指定域名并指定域名所在的网站根目录,acme.sh 会全自动的生成验证文件,并放到网站的根目录,然后自动完成验证,最后会聪明的删除验证文件,整个过程没有任何副作用。
 
如果你用的 apache服务器,acme.sh 还可以智能的从 apache的配置中自动完成验证,你不需要指定网站根目录:
 
acme.sh --issue -d mydomain.com --apache
 
默认生成的证书都放在安装目录下:/home/wwwroot/mydomain.com/,或是在这个目录下:/www/server/panel/vhost/cert/domain.com_ecc/
 
经过等待120秒后,证书就会自动生成:
 
[Tue Oct 29 15:41:21 CST 2024] Your cert is in /home/wwwroot/mydomain.com/domain.com.cer
[Tue Oct 29 15:41:21 CST 2024] Your cert key is in /home/wwwroot/mydomain.com/domain.com.key
[Tue Oct 29 15:41:21 CST 2024] The intermediate CA cert is in /home/wwwroot/mydomain.com/ca.cer
[Tue Oct 29 15:41:21 CST 2024] And the full chain certs is there: /home/wwwroot/mydomain.com/fullchain.cer
 
显示类似上面的提示,说明证书就生成成功了,接下来把证书安装上。
 

三、安装证书(重点)

 
acme.sh 在完成验证生成证书以后,不会私自更改你本身的配置,你需要自己配置 ssl 的配置,否则只能成功生成证书,你的网站还是无法用https协议访问。接下来需要把证书 copy 到真正需要用它的地方。
 
注意:默认生成的证书都放在安装目录下: /home/wwwroot/mydomain.com/,请不要直接使用此目录下的文件,例如:不要直接让 nginx/apache 的配置文件使用这下面的文件,这里面的文件都是内部使用,而且目录结构可能会变化。
 
正确的使用方法是使用 --installcert 命令,并指定目标位置,然后证书文件会被copy到相应的位置。
 
宝塔面板安装证书
 
你要先知道你的域名证书指向的路径在哪:
 
 
可以看到宝塔面板默认的证书路径是:/www/server/panel/vhost/cert/{域名}
 
旧版本的宝塔面板默认的证书路径是:/etc/letsencrypt/live/{域名}
 
如果还没有安装过证书,那么此路径是没有域名证书文件夹的。
 
所以,生成证书后,到/home/wwwroot/目录下找到域名文件夹,可以看到下面2个文件
 
fullchain.cer            #证书
xx.com.key               #密钥
 
先把上面2个文件下载回来,然后打开复制里面的内容到宝塔面板配置ssl证书的地方,如下图
 
 
最后再执行以下命令(记得修改为你的证书路径)
 
acme.sh --install-cert -d mydomain.com -d www.mydomain.com \
--key-file       /www/server/panel/vhost/cert/mydomain.com/privkey.pem  \
--fullchain-file /www/server/panel/vhost/cert/mydomain.com/fullchain.pem \
--reloadcmd     "service apache2 force-reload"
 
或执行以下命令
 
acme.sh --install-cert -d mydomain.com -d www.mydomain.com \
--key-file       /www/server/panel/vhost/cert/mydomain.com/privkey.pem  \
--fullchain-file /www/server/panel/vhost/cert/mydomain.com/fullchain.pem \
--reloadcmd     "service httpd force-reload"
 
如果出错提示找不到apache2或httpd服务的话,是因为在某些Linux发行版中,服务的名称可能是apache2、httpd或者根据发行版的不同而有其他的名称。如果你不确定服务的准确名称,可以使用systemctl list-units --type=service命令列出所有服务,然后找到Apache的正确服务名称。
 
命令解读
 
--install-cert #安装证书
 
--key-file #指定安装证书密钥路径
 
--fullchain-file #指定安装证书路径
 
--reloadcmd #重新加载nginx生效
 
为什么要使用那么多参数
 
  • 因为acme证书虽然60天更新一次,但是更新的证书路径是:/home/wwwroot/mydomain.com/
  • 你的域名指向的证书路径并不是在 /home/wwwroot/mydomain.com/
  • 不能使用/home/wwwroot/mydomain.com/文件夹中的证书文件,它们仅供内部使用,文件夹结构将来可能会更改
  • 这些参数会被acme保存起来,下次自动更新时就会自动把证书安装到指定的路径,然后帮你重新加载Apache生效
 

四、强制更新证书

 
目前证书在60天以后会自动更新,你无需任何操作。今后有可能会缩短这个时间,不过都是自动的,你不用关心。请确保 cronjob 正确安装,看起来是类似这样的:
 
crontab  -l
 
56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
 
 
但你要强制更新的话,可以执行下面的命令
 
acme.sh --renew-all
 
如果你的服务器有多个网站的SSL证书,而你只想更新其中一个网站的SSL证书,可以使用“-d 域名”参数,例如
 
acme.sh --renew -d xxx.com --force
 

五、如何停止证书续订

 
要停止证书的续订,您可以执行以下操作以从续订列表中删除证书:
 
acme.sh --remove -d xxx.com
 
不会从磁盘中删除证书/密钥文件。您可以自己删除相应的目录 (例如 /home/wwwroot/mydomain.com/ )。
 

六、如何升级 acme.sh

 
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.您可以将acme.sh更新为最新代码:
 
acme.sh --upgrade
 
您还可以启用自动升级:
 
acme.sh --upgrade --auto-upgrade
 
然后acme.sh将自动保持最新。
 
禁用自动升级:
 
acme.sh --upgrade --auto-upgrade 0
 

七、以下是一些常用的命令

 
查看定时任务:crontab -l
 
查看版本:acme.sh -v
 
查看现有的SSL证书:acme.sh --list
 
升级到最新版本:acme.sh --upgrade(如果失败的话,用acme.sh --upgrade --use-wget)
 
更改默认为letsencrypt证书:acme.sh --set-default-ca --server letsencrypt
 
查看已安装证书信息:
 
acme.sh --info -d example.com
# 会输出如下内容:
DOMAIN_CONF=/home/wwwroot/mydomain.com/mydomain.com.conf
Le_Domain=mydomain.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=/www/server/panel/vhost/cert/mydomain.com/privkey.pem
Le_ReloadCmd=service nginx force-reload
Le_RealFullChainPath=/www/server/panel/vhost/cert/mydomain.com/fullchain.pem
 
定时更新证书:acme.sh --cron
 
如果要撤销一个证书,使用:
 
acme.sh --list
acme.sh --revoke -d mydomain.com
 
如果要删除一个证书,使用:
 
acme.sh --list
acme.sh --remove -d mydomain.com

© copyright 2002-2024, 22BA.COM All Rights Reserved

网站备案号:粤ICP备19114910号

ChuangXiang Design Studio - WebDesign & Internet Marketing

关于我们业务范围联系我们开心一刻网站地图

QQ群一:326338868QQ群二:78712271

QQ群三:193078177

邮箱:news@22ba.com

地址:深圳市福田区金田路现代国际大厦2606