熟悉陌涛的都知道,陌涛一直都在使用 acme.sh 作为服务器端申请、部署、续期免费 SSL 证书的主要工具,今天在帮一个站长申请 SSL 证书的时候发现 acme.sh v3.0 开始默认的免费 SSL 证书变更为:ZeroSSL 了,这个 ZeroSSL 其实跟陌涛一直用的 Let's Encrypt 类似,在 2016 年就已经推出,和 Let's Encrypt 一样,证书有效期只有 90 天,支持泛域名 SSL 证书。和 Let's Encrypt 不同的是,ZeroSSL API 没有速率限制,不存在同一 IP 多次申请 SSL 证书被限制的问题,ZeroSSL 还提供了 WEB 界面可在后台管理 SSL 证书,相比 Let's Encrypt 功能更加丰富。
对于这个 ZeroSSL 证书陌涛很早就听说过,也顺手到其官网(https://zerossl.com/)上注册了一个账号,有兴趣的朋友可以参考一下 ZeroSSL 官网的一篇有关 ZeroSSL VS Let's Encrypt 的对比文章(点击直达),对比下来相对于 Let's Encrypt 来说 ZeroSSL 最大的亮点就是带有一个 web 端的 SSL 证书查询和管理平台可以更加直观的管理申请的 SSL 证书,另外就是 ZeroSSL 还提供了比较完善的 API 接口便于二次开发啥的,简单点儿来说 ZeroSSL 更加适合有特殊高级用途的站点选择使用,对于我们普通仅仅需要 HTTPS 的站长们来说 Let's Encrypt 其实就完全够用了,但是陌涛这里建议大家更换 Let's Encrypt 为 ZeroSSL。
首先安装acme.sh
acme.sh 实现了 acme 协议,可以帮助你快速申请SSL证书,自动更新证书等操作,极大简化操作步骤。在使用之前,我们需要先安装,以下命令均在Linux系统完成。
代码语言:javascript复制curl https://get.acme.sh | sh
source ~/.bashrc
或者:
代码语言:javascript复制wget -O - https://get.acme.sh | sh
使用curl命令安装的第一次出现了如图的错误,提示可以先安装 socat ,因为我不需要,所以没有安装。curl安装失败,可以使用wget命令尝试。
设置为自动更新(可选):
代码语言:javascript复制acme.sh --upgrade --auto-upgrade
acme的GitHub地址:https://github.com/acmesh-official/acme.sh
安装acme完成后使用“acme.sh -v”命令查看版本号,代码如下:
代码语言:javascript复制acme.sh -v
按照网上所说的acme.sh 2.x版本默认使用Let’s Encrypt作为服务提供商,3.x之后默认使用的是ZeroSSL,但是由于我第一次弄,所以还是重新更换默认服务商为ZeroSSL,代码如下:
代码语言:javascript复制acme.sh --set-default-ca --server zerossl
系统返回的命令就是zerossl服务商,然后我们设置下域名解析的DNS API。
配置DNS API
SSL证书验证可通过DNS验证、文件验证等多种方式,为了方便多个域名申请以及后续证书更新,推荐使用DNS API方式,不过在使用前需要先进行设置。 如果使用的DNSPOD(国内版),命令为:
代码语言:javascript复制export DP_Id="00250"
export DP_Key="imotao.com"
将ID换成自己的,把Token值放在Key之内,然后执行命令,如图:
acme.sh部署完成后我们来申请ZeroSSL泛域名SSL证书,需要先关联账户,执行下面的命令会自动关联账户,命令如下(admin@imotao.com改成你自己的ZeroSSL邮箱,即使没注册,运行命令之后也会自动注册的):
代码语言:javascript复制acme.sh --register-account -m admin@imotao.com --server zerossl
命令执行后,如图,会给你反馈一些信息,记下来就行,一般用不到。
账户注册关联完成后申请泛域名证书,执行以下命令:
代码语言:javascript复制acme.sh --dns dns_dp --issue -d *.imotao.com -d imotao.com
其中 dns_dp 是指DNSPOD,*.imotao.com 换成您的 域名即可
PS:一定要设置两个域名,一个是*.域名,另外一个是域名,按照代码命令设置,图中未设置imotao.com,访问的时候会提示证书错误,切记!!!
注:acme.sh支持多个DNS服务商,演示用的dnspod,其他的服务商可以参考官方文档:https://github.com/acmesh-official/acme.sh/wiki/dnsapi 进行查看设置。
生成过程中,几分钟左右即可完成,在验证的过程中会自动解析一个TXT记录,校验完成后会自动删除,所以建议大家选择DNS校验,这里就不截图了,感兴趣的可以是dnspod域名继续的记录查看。待验证通过后即表示申请成功,如图所示,会给我们反馈证书生成的路径:
生成的证书放在了/root/.acme.sh/*.imotao.com目录,因为这是 acme.sh 脚本的内部使用目录,而且目录结构可能会变化,所以我们不能让 Nginx 的配置文件直接读取该目录下的证书文件,需要使用--installcert命令,指定目标位置,然后证书文件会被 copy 到相应的位置,我们先去/home/目录下新建一个/ssl/文件夹,进入文件夹在新建一个/域名文件夹/,例如, /home/ssl/imotao.com/,然后执行以下命令:
代码语言:javascript复制acme.sh --installcert -d *.imotao.com
--key-file /home/ssl/imotao.com/*.imotao.com.key
--fullchain-file /home/ssl/imotao.com/fullchain.cer
--reloadcmd "service nginx reload"
把“*.imotao.com”替换成刚刚您自己申请的泛域名,再把“*.imotao.com.key”换成刚刚生成的SSL证书密钥文件,fullchain.cer不需要替换了,默认生成的就是这个。
另外还得说下,我直接执行命令的时候出错(cannot touch错误 ),所以才新建目录之后才执行,执行完成后,在目录中才能看见被Copy的文件。正确的显示如下:
即完成命令之后会自动迁移,但是重启的命令出错,(重载代码已更新,不会出现图中错误),如图无效去AMH面板中重载nginx即可,证书配置完成后,我们需要部署到网站,打开对应的站点,点击站点配置,在弹出的界面选择SSL,然后选择其他证书,把刚刚Copy的文件内容复制到证书里面,到密钥(KEY)对应的是.key文件,证书(PEM格式)对应的是.cer文件。
复制完成后点击底部保存按钮,关于是否开启http强制跳转httls随意,建议开启,在SSL证书应用,设置完成后,打开配置文件,地址:/home/wwwroot/lnmp01/vhost/ 域名-https.conf (就是你环境的vhost这个文件)如图:
其他内容都不需要管,因为是系统生成的,我们只需要把SSL证书的路径更换一些,代码如下:
代码语言:javascript复制 ssl_certificate_key /home/ssl/imotao.com/fullchain.cer;
ssl_certificate /home/ssl/imotao.com/*.imotao.com.key;
把证书的路径换成我们刚刚Copy的路径即可。一切就绪之后我们打开网站,查看SSL证书,如图:
目前证书有效期是90天,三个月后按理说会自动续期,至于结果如何我们三个月后再见了,码了小半天的文章,测试了整整一天。
当然网上的教程很多,只不过他们会忽略一步基本的步骤,导致我测试的时候有些抓瞎,所以才把完整的步骤整理后重新发布一篇,有问题留言反馈吧。
卸载证书
今天更新下,怎么卸载已经存在的证书:
首先使用
代码语言:javascript复制acme.sh --list
命令查看目前服务器所存在的证书,如图,目前仅有一个证书:
然后我们使用:
代码语言:javascript复制acme.sh --revoke -d *.imotao.com
acme.sh --remove -d *.imotao.com
--revoke,销毁一个证书,
--remove,从acme.sh已知的证书列表中删除证书。
证书卸载吊销完成后,我们需要的话在重新申请吧,最好回到证书的目录看看证书是否删除,未删除的话手动删了吧。