Linux下使用acme.sh免费申请Let’s Encryptssl证书-HTTPS站群搭建最佳实践之二

网络建站

所以说,对于我们这些草根博客站长们来说,部署SSL启用HTTPS也可以提到日程上来了。去年的时候HTTPS对于我们站长们来说还是有点“白富美”高攀不上的感觉。但是到今天来看,SSL证书已经没有“白富美”的神秘感了,甚至连开源免费的SSL证书也都出现了。重点是支持api签发和统配。接下来起子就结合自己部署SSL的经验给大家做个HTTPS系列的教程分享吧,以方便大家及时部署自己博客的SSL证书。

1.起头

今天我们就先从“申请获取免费SSL证书”讲起。

“免费”这个概念可以说在中国互联网里绝对是个“烂大街”的玩法了,“免费的永远也是最贵的”都成了众多老网民的普遍认识了。但是,作为博客站长一定要高清楚“营销型免费”和“技术开源型免费”的区别哦,这从根本上还是有很大的区别的,“营销型免费”最终都是为了“填坑”的,“技术开源型免费”有时候才能称得上是真正的“免费”比如,开源的Linux、开源的 WordPress 等等。这些我们都可以免费安全的使用而不需要支付任何的费用,也不用担心有“坑”需要“填”。那么,说回SSL证书,也有“开源免费”的,那就是——Let’s Encrypt SSL证书。

关于Let’s Encrypt 免费SSL证书

Let’s Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向HTTPS过度的进程,目前已经有越来越多的商家加入和赞助支持。

Let’s Encrypt免费SSL证书的出现,也会对传统提供付费SSL证书服务的商家有不小的打击。到目前为止,Let’s Encrypt获得IdenTrust交叉签名,这就是说可以应用且支持包括FireFox、Chrome在内的主流浏览器的兼容和支持,虽然目前是公测阶段,但是也有不少的用户在自有网站项目中正式使用起来。

Let’s Encrypt 的最大贡献是它的 ACME 协议,第一份全自动服务器身份验证协议,以及配套的基础设施和客户端。这是为了解决一直以来 HTTPS TLS X.509 PKI 信任模型,即证书权威(Certificate Authority, CA)模型缺陷的一个起步。

在客户端-服务器数据传输中,公私钥加密使得公钥可以明文传输而依然保密数据,但公钥本身是否属于服务器,或公钥与服务器是否同属一个身份,是无法简单验证的。证书权威模型通过引入事先信任的第三方,由第三方去验证这一点,并通过在服务器公钥上签名的方式来认证服务器。第三方的公钥则在事先就约定并离线准备好,以备访问时验证签名之用。这个第三方就称为证书权威,简称CA。相应的,CA验证过的公钥被称为证书。

问题是,如果服务器私钥泄露,CA无法离线使对应的证书无效化,只能另外发布无效记录供客户端查询。也就是说,在私钥泄露到CA发布无效记录的窗口内,中间人可以肆意监控服-客之间的传输。如果中间人设法屏蔽了客户端对无效记录的访问,那么直到证书过期,中间人都可以进行监控。而由于当前CA验证和签发证书大多手动,证书有效期往往在一年到三年。

Let’s Encrypt 签发的证书有效期只有90天,甚至希望缩短到60天。有效期越短,泄密后可供监控的窗口就越短。为了支撑这么短的有效期,就必须自动化验证和签发。因为自动化了,长远而言,维护反而比手动申请再安装要简单。

证书的有效期,我坚持认为这是合理的。Let’s Encrypt 的证书是自动签发的,对 Let’s Encrypt 的目标用户(个人网站、小网站)来说,90天已经是一个很长的时间了。特别是个人网站,域名所有权的变动是非常快的。可能前几天域名还属于张三,后几天就属于李四了。因此自动签发一个长有效期的证书是很容易产生问题的。如果证书的有效期是两年,那么经常交易域名的人就可以长时间持有已经不属于他们的域名的证书。并且这种持有不受证书吊销列表的控制,因为签发的时候,所有权是没有问题的,即使后来所有权变更了,Let’s Encrypt 也不会知道。所以设的有效期短一点,可以减少这个问题的影响。然后是易用性,现在已经有不少的 Let’s Encrypt 自动续期脚本了,配好后就不用管了,非常方便。

总之,强烈推荐站长和服务器平台用 Let’s Encrypt 向访客提供加密连接。这是域名认证未来的发展方向。

怎么样,看了上述有关Let’s Encrypt的介绍后,是否还鄙视这种“免费”SSL证书呢?

2. 操作

直接从github 下了acme脚本

添加权限

安装脚本,添加环境,配置账号

安装完成后会创建 /root/.acme.sh/文件夹,文件夹中会添加acme.sh的副本

此时会出现提示大概就是在 DNS 中添加一条 _acme-challenge 的 TXT 记录,然后 Let’s Encrypt 会去验证这个域名返回的 TXT 是否正确,设置完成后可以用下面的命令确认下。

完成后

证书的位置在/root/.acme.sh/*.drscrewdriver.com

dnspod 还可以设置dns,pod的apikey 认证时使用 –dns dns_dp替换dns

 


更新

acme.sh的版本进行了版本,现在手动dns需要了解手动模式和别名

-yes-I-know-dns-manual-mode-enough-go-ahead-please参数识别后才能开始手动模式

–challenge-alias 加上后才能一次验证

3. copy/安装 证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.

注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.

正确的使用方法是使用 –installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

acme.sh –installcert -d mydomain.com \

--key-file /etc/nginx/ssl/mydomain.key \

--fullchain-file /etc/nginx/ssl/mydonain.cer \

--reloadcmd "service nginx force-reload"

(一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload)

–installcert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.

值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.

4. 更新证书

目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.

5. 更新 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

好了,到此acme.sh的使用基本就是这些了,至于是采用HTTP还是DNS方式来申请证书?就起子的经验来看,我比较喜欢DNS的验证方式,因为这种方式的依赖性最小,更加的灵活,我建议大家都用DNS来验证申请Let’s Encrypt证书。

当然,acme.sh还有不少实用的参数可以方便我们来管理已经通过acme.sh申请过证书、域名等等,比如:

acme.sh –list

这个就是列出当前已经申请到证书的域名信息,如下图:

具体的参数,大家可以使用 acme.sh --help 来查看。

其实 acme.sh 的使用还是非常“傻瓜”的,只要照着指令参数做就可以轻松搞定的,上述的示例其实将域名修改为自己的域名就可以用了,其它的也是同样的道理,简单修改一下参数就可以拿来用的。目前,申请获取Let’s Encrypt证书有很多种方法,军哥的LNMP一键包里也可以直接申请的,网上也有不少申请Let’s Encrypt证书的教程,使用的工具可以说是五花八门。但是,就起子的经验来看 acme.sh 这个是最方便、最快捷、最省事儿的,因为使用的就是Let’s Encrypt的ACME协议,所以兼容性绝对是最可靠的,Shell脚本式的对系统几乎没有任何依懒性,有很强的自由度。

继续阅读