免费Https证书Let Encrypt续期
1、写在前面
关于 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 自动续期脚本了,配好后就不用管了,非常方便。
2、需求环境
1.主要面向续期 Let’s Encrypt 免费证书的个人网站
2.部署环境为
- CentOS 系统
- Nginx
当上述了解清楚后就可以开始续期我们的 Let’s Encrypt 免费证书,亦或者重新部署 Let’s Encrypt 免费证书替代你的不佳 Https
3、安装及配置
3.1 准备 acme.sh 协议
curl [https://get.acme.sh](https://get.acme.sh) | sh
若提示无权限,请使用 sudo 运行,因为 acme 生成的路径为~(root)/.acme.sh 目录下 并可以创建一个 bash 的 alias, 方便你的使用:
alias acme.sh=~/.acme.sh/acme.sh
3.2 生成安全证书
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证.
这里仅提供三种方式面向用户生成证书文件 【www.mydomain.com】是指自己的域名,若使用Nginx配置,请对应相应的conf配置文件下的网站域名
一、寻址根目录
需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书
1 | acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/ |
按照官方的话来说,只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用。
二、链接 Apache 服务器
1 | acme.sh --issue -d mydomain.com --apache |
三、链接 Nginx 服务器
1 | acme.sh --issue -d mydomain.com --nginx |
值得我们注意的是,无论是 Apache 还是 Nginx 生成证书模式, acme.sh 在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏, 也有一个缺点, 你还需要自己手动配置 SSL 的配置否则只能成功生成证书, 你的网站还是无法访问 Https
3.3 部署安全证书
刚刚我们用 acme.sh 命令生成了安全证书,都均存放在~/.acme.sh 目录下,但是请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化的。
正确方法如下:
1 | acme.sh --installcert -d <domain>.com \ |
- 注意,分步执行,同时看看官方的说明:
这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload
Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/
.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误
3.4 更新 acme.sh
手动更新命令:
<font style="color:#F5222D;">acme.sh --upgrade</font>
自动更新命令:
<font style="color:#F5222D;">acme.sh --upgrade --auto-upgrade</font>
自动更新命令:
4、写在后面
<font style="color:#F5222D;">acme.sh --list</font>
使用该命令,可以快速查看绑定安全证书的网站
更多的参数,可以敲击acme.sh --help
来查看帮助
笔者开题缘由
因为我也在续期证书的时候遇到瓶颈,当初这个证书的确是会自动续签的,但是居然在某一天停止了,所以我就找出问题,后来发现是几年来没更新 acme 协议和 letsencrypt CA 造成的,所以一口气下来就重新部署了。由于我是 Nginx 服务器上的网站,所以这件有段小插曲也是发生在 Nginx 下,最重要还是要善用nginx -t
命令和systemctl status nginx.service
来判定错误位置,同时在使用生成安全证书于网站根目录方式的话,记得没有权限判断这个网站是否为你时候,记得要如此操作。
尝试生成**.well-known**
在你的网站根目录下新建一个目录.well-known 即可
mkdir .well-known
更改配置问题
于 Nginx 配置文件 nginx.conf 做出修改
1 | location ~ /\.ht { |
以上删除
1 | location /.well-known/ { |
增加上述即可
2018.11.16
今天再一次续签 https 续签 A 域名不小心覆盖了 B 域名由此大家注意 nginx 问题
贴上自检命令
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
同时需要善用几个高级的 acme.sh 命令
1.高级 debug
acme.sh --issue ..... --debug 2
2.高级 Nginx
acme.sh --issue -d domain.com -w nginx:$NGINX_HOME/conf/nginx.conf
免费Https证书Let Encrypt续期
https://blog.catooilg.com/2020/09/02/yuque/免费Https证书Let Encrypt续期/