在做程序的事情上,我们一直在偷懒,比如上个世纪的懒,相比c++,jvm把垃圾回收的事情,给你干了。所以我觉得代码的终极之道就是偷懒,把简洁明了做到极致。
  创业中,一切都要节省,自然而然,在多个场景下,比如安全,比如微信强制https,等等原因,我们知道了免费的ssl证书申请及服务商:https://letsencrypt.org/ 让我们x(词)x(穷)吧。
以及免费申请的网站:https://www.sslforfree.com。
  当然现在很多国内和国外云服务或域名服务商都能提供了一些1年这种单域名的证书,已经非常方便及容易申请到了,不过每增加一个域名就要走一遍流程,有的还要审核,有的一个账号只能申请一个证书,林林总总,都不如这个免费的通配域名做到永久这么方便。
  这里用到了: acme.sh
以下以centos 7+为例演示

1、安装

curl https://get.acme.sh | sh

curl https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh | INSTALLONLINE=1  sh

git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install   

他们更新了,强制要邮箱 20231103

使用下方命令,并且把邮箱换成自己的

curl https://get.acme.sh | sh -s email=my@example.com

2、生效

安装后会自动给.bashrc文件添加一条环境变量引用的文件
1591716816092.jpg

所以可以使用acme.sh命令啦,执行

acme.sh -v

centos 7下没有自动生效,如果报 command not found

source ~/.bashrc

让修改生效即可

3、申请3个月的证书

PS: 我看到网上很多人喜欢丢文件到服务器的方式来配置,毕竟这样修改最少,但是这里要用到dns解析txt验证。而且acme.sh支持非常多的api,像阿里dns_ali,腾讯dns_dp,aws,azure,godady等国内国外的,acme都做了api的支持,非常全面。
这里以阿里云DNS接口为例。
阿里云开启RAM后,一般以子账号给最小权限的方式。

先创建账号

1591719245633.jpg

勾选编程访问后,创建的子账号会自动生成 accesskeyid 和accesskey secret
这里key和secret都只会展示一次,所以复制后备用。

添加权限

1591719372969.jpg

只需要添加下图这一项权限即可
1591719447533.jpg
然后把api的key和secret信息配置到acme目录下配置文件上
位置:/root/.acme.sh/dnsapi/dns_ali.sh
把解注key和secret(#号去掉),然后把自己的值按原值格式编辑上去即可

1591719723427.jpg
配置和权限添加完成后,即可使用如下命令申请证书啦,后面步骤都是自动完成,等待即可

acme.sh   --issue --dns dns_ali -d  *.qzmer.me

20210318更新

acme.sh   --issue --dns dns_ali -d  *.qzmer.me
 --dnssleep 300

最近更新中添加了公共dns检查,但是这个是没必要的,直接跳过即可快速通过

4、安装到服务

  其实通过上面的命令,走完流程,证书已经安装到你服务器上了,目录位于
/root/.acme.sh下,下图所示另一个二级域名的
1591715468722.jpg
当然为了方便,acme.sh仍然添加了自动安装到某个目录的命令,以及添加了安装成功后的hooks,方便安装完成后执行刷新应用服务的操作。

命令如下
acme.sh  --installcert  -d  *.qzmer.me   \
        --key-file   /etc/nginx/ssl/qzmer.me.key \
        --fullchain-file /etc/nginx/ssl/qzmer.me.cer \
        --reloadcmd "service nginx force-reload"

这里使用nginx重启命令

推荐:service nginx force-reload
不推荐:nginx -s reload

是因为实测某些情况下,reload不会刷新证书,导致无效的情况,所以为了有效,他们文档中也有说明 acme.sh的WIKI。当然这里有些用户发现没有该命令,这是因为nginx不是使用service启动导致的。当然如果支持服务启动,建议以后都使用服务启动

service nginx start

以服务启动nginx才可以使用 force-reload。至于通过下载源码安装的,请查看我即将写的nginx篇,解决。yum安装nginx省了很多手动的步骤,推荐哦。

5、通过api自动更新

  上面的步骤做完,然后配好nginx,即可使用啦,
这里还有一个测试网站:https://csr.chinassl.net/ssl-checker.html 当然自行验证即可。
然后就是自动更新的部分啦,
acme.sh安装后做了一个事情,就是crontab,如下
1591714823242.jpg
每天定时去做更新的,更新成功,会就会自动重启应用,
把命令打印一下日志,即可看到执行记录啦
1591718427186.jpg
每天更新的记录
1591718562051.jpg
其实每次执行完全部命令后,acme.sh会自动把上次执行命令行api的key和secret及更新配置生成一个account.conf文件保存到根目录下,下次执行更新检查时,就会使用该配置,所以不用再手动配置自动更新的参数。当然这也导致了一个弊端,就是没法同时更新多个账号下的证书。这个看acme.sh啥时候能支持了(当然动手能力强的,也可以自己想办法支持,这是可以做到的)
最后,这里还提到一个点,就是开启自动更新,因为letsencrypt一直在更新,我碰到过acme.sh未开启更新,导致证书更新失败的情况,接口也要与时俱进。

acme.sh  --upgrade  --auto-upgrade

  如上操作完,就完成了生成通配证书和自动更新配置证书的全部流程。无意外的情况下,自动更新的免费通配域名证书就搞定啦!