Linuxops
  • Linuxops
  • 2017-06-01
  • Linux

CertBot自签Let's Encrypt免费SSL单域名证书和泛域名证书

版权说明:本文为博主原创,如果转载请注明来源。作为学习笔记,不能保证所有知识点是完全正确以及表达无误,用于生产环境配置时请斟酌。如有错误或建议请联系。侵删联系:linuxops@foxmail.com。感谢各位!

一、前言

基于明文传输的HTTP协议会造成很大的安全隐患,为了解决这些隐患诞生了HTTPS协议。

HTTP的三大风险:

  • 窃听风险(eavesdropping):第三方可以获知通信内容。
  • 篡改风险(tampering):第三方可以修改通信内容。
  • 冒充风险(pretending):第三方可以冒充他人身份参与通信。

对于HTTP协议的风险,HTTPS协议给出了解决方案:

  • 所有信息都是加密传播,第三方无法窃听。
  • 具有校验机制,一旦被篡改,通信双方会立刻发现。
  • 配备身份证书,防止身份被冒充。

SSL(安全套接层)以及继任者TLS(传输安全层)是为网络通信提供安全以及数据完整性的一种安全协议,TLS与SSL再传输层对网络进行加密。 在如今的网站建设中,SSL已然成为标准配置,以往传统的HTTP已经无法满足现在的安全需求,在对接第三方平台,例如高德地图、微信公众号等均要求使用HTTPS,否则无法访问第三方接口。

HTTPS的证书有三种:

  • DV证书(域名验证型证书),这种证书仅验证域名所有权,颁发快速;
  • OV证书(组织验证型),这种证书对申请者做严格的身份验证并且提供可信身份证明,具有较高的安全性。
  • EV证书(超安全证书),这种证书遵循全球统一的严格身份验证标准,是目前业界安全级别最高的顶级(class 4)证书。通常金融行业、网上商城等重点强调网站安全、企业可信形象的网站需要此种证书。

所以根据安全等级的不通申请证书的费用和周期也是不同的,DV证书虽然最便宜,但是目前市面上最便宜的泛解析域名也要2000元每年个域名。对于例如测试环境或者其他并不是迫切需要的我们并不想花这种“冤枉钱”。

开放是互联网的最核心的精神,所以我们也能找到免费的ssl证书提供商,并且得到了市面上绝大部分的浏览器信任。

在市面上做的最好的就是Let's Encrypt,Let's Encrypt虽然只提供了3个月免费的DV证书,但是他还提供了一个自动签发的工具CertBot,使用CertBot可以自动无限次续费证书。

Let's Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS,目前Facebook等大公司开始加入赞助行列。

Let's Encrypt已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被Mozilla、Google、Microsoft和Apple等主流的浏览器所信任,你只需要在Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let's Encrypt安装简单,未来大规模采用可能性非常大。

闲话少说,开始配置。


二、准备环境

安装nginx,并启动,保证80端口可用。

CertBot有多种方式来创建证书,但通常在生产环境中我们不能停止服务来穿或者更新证书,CertBot提供了webroot方式来创建证书,通过webroot方式创建证书无需停止服务,但是为了验证,CertBot会在更目录下创建文件并且通过指定的域名访问,以此来认证身份。

安装CertBot

网络和官方推荐的centos的安装方式是通过yum来安装,但是yum安装会有很多未知的问题(阿里云主机),不知道其他的是否也是这样,所以还是推荐使用自动脚本安装,目前在阿里云环境里没有发现什么问题。

1.通过yum安装(不推荐)

centos可以通过yum来安装CertBot,安装之前先安装一下依赖

yum install -y python-devel openssl openssl-devel  yum-utils #准备好依赖
pip install --upgrade pip #更新pip
sudo yum install certbot #安装CertBot

安装完毕,可以通过certbot --help 查看帮助。

[root@Certbot ~]# certbot --help
Traceback (most recent call last):
 File "/usr/bin/certbot", line 9, in <module>
   load_entry_point('certbot==0.12.0', 'console_scripts', 'certbot')()
 File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
   return get_distribution(dist).load_entry_point(group, name)
 File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
   return ep.load()
 File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
   entry = __import__(self.module_name, globals(),globals(), ['__name__'])
 File "/usr/lib/python2.7/site-packages/certbot/main.py", line 21, in <module>
   from certbot import client
 File "/usr/lib/python2.7/site-packages/certbot/client.py", line 10, in <module>
   from acme import client as acme_client
 File "/usr/lib/python2.7/site-packages/acme/client.py", line 31, in <module>
   requests.packages.urllib3.contrib.pyopenssl.inject_into_urllib3()
 File "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 112, in inject_into_urllib3
   _validate_dependencies_met()
 File "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 147, in _validate_dependencies_met
   raise ImportError("'pyOpenSSL' module missing required functionality. "
ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.
[root@Certbot ~]#

但是报错了,这个错误是pyOpenSSL版本问题引起的,找了各种方法,升级了各个版本的pyOpenSSL均无法解决,这可能是certbot的一个bug。

最终找到了解决方案

rpm --query centos-release  # centos-release-7-3.1611.el7.centos.x86_64
wget ftp://ftp.muug.mb.ca/mirror/centos/7.3.1611/cloud/x86_64/openstack-mitaka/common/pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo rpm -Uvh pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo yum install certbot
certbot renew  # OK

安装pyOpenSSL-0.15.1-1.el7.noarch.rpm完美解决。

[root@Certbot hyc.rxcha.com]# certbot --version
certbot 0.12.0
[root@Certbot hyc.rxcha.com]#

2.通过官方脚本安装(推荐)

[root@Certbot ~]# wget https://dl.eff.org/certbot-auto  #下载脚本
[root@Certbot ~]# chmod +x certbot-auto #授于执行权限
[root@Certbot ~]# mv certbot-auto /usr/bin/certbot #将脚本剪切在用户bin目录下
[root@Certbot ~]# source /etc/profile 
[root@Certbot ~]# certbot --version #查看版本,第一次运行certbot会自动下载安装依赖包。如果输出版本号,说明安装成功。
certbot 0.15.0

以上,certbot安装成功!


三、使用命令签证

1.单域名签证

签证之前一定要先运行网站,这样才能正常验证。

sudo certbot certonly --webroot -w /usr/share/nginx/html/ -d your.domain.com

如上命令,其中:

--webroot:指定使用webroot方式签证(不需要停止web服务)

-w /usr/share/nginx/html/:指定网站的根目录,certbot会在更目录下创建.well-known目录用做认证。

-d your.domain.com :指定域名,必须要绑定到-w的目录中。

因为是首次签证,所以运行之后会询问一些诸如是否同意协议之类的,一直同意就好了,知道出现如下就代表签证成功。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/hyc.rxcha.com/fullchain.pem. Your cert will
   expire on 2017-08-30. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

应用到web服务中

签证好了的证书文件存放在 /etc/letsencrypt/live/your.domain.com/目录下,每个域名一个目录,里面内容如下:

[root@Certbot your.domain.com]# ll
total 4
lrwxrwxrwx 1 root root  37 Jun  1 22:18 cert.pem -> ../../archive/your.domain.com/cert1.pem
lrwxrwxrwx 1 root root  38 Jun  1 22:18 chain.pem -> ../../archive/your.domain.com/chain1.pem
lrwxrwxrwx 1 root root  42 Jun  1 22:18 fullchain.pem -> ../../archive/your.domain.com/fullchain1.pem
lrwxrwxrwx 1 root root  40 Jun  1 22:18 privkey.pem -> ../../archive/your.domain.com/privkey1.pem
-rw-r--r-- 1 root root 543 Jun  1 22:18 README
[root@Certbot your.domain.com]#

可以看出live目录下的都是软连接,/etc/letsencrypt/archive文件,建议在nginx配置中应用这个软连接。

这样就每次重签的时候就不需要更改nginx的配置了。

根据实际经验,事实上在更换证书的时候要需要清理NGINX的缓存,并且reload新证书才会生效。

nginx的配置就不多说了。

server {
        listen       443 ssl;
        server_name  your.domain.com;

        ssl_certificate      /etc/letsencrypt/live/your.domain.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/your.domain.com/privkey.pem;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }

2.泛域名签证

2018-05-14更新

2018年3月13日,Let’s Encrypt 终于在社区宣布支持通配符证书,但是泛域名有以下限制:

  • 无法通过webroot方式签证,必须使用dns的方式。
  • certbot提供了多个第三方的插件,但是没有国内的DNS服务商插件(我们的服务大部分基于阿里云DNS)
  • 依然限制90天的有效期

签证的方式影响着我们的工作量,因为没有阿里云DNS的插件,所以我们只能通过手动的交互方式来签证。证书即将到期时,依然需要手动的方式去续约,如果你管理的域名不是很多,没三个月操作一次也是可以的,但是因为手上管理着几十个域名,所以感觉泛域名的方式也并非适合我。

泛域名证书中,.abc.com可以使用同一张证书,但是 123.*.abc.com就不能和 .abc.com使用同一张证书了,我们现在大量使用三级四级域名,所以这种泛域名的签证方式并不适合我们(需要手动更新,维护工作量巨大)

好了,下面我们看一下怎么泛域名是怎么签证。

泛域名签证使用的是ACME V2版本的协议,certbot0.22.0以上的版本支持新的协议,所以我们要先检查一下certbot的版本是否达到需求.

[root@OPS ~]# certbot --version
certbot 0.24.0 #显然我的版本达到了要求

然后使用以下命令即可签发泛域名证书:

[root@OPS ~]# certbot certonly  -d *.abc.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory 

certonly 表示只签证 -d 指定了需要签证的域名 --manual 指定了以手工交互模式签证 --preferred-challenges dns 指定了通过DNS挑战来验证 --server 指定acme的服务器

回车之后会有一系列的交互信息需要填写,例如email地址、是否同意协议等等(不同意协议当然不给你签证啦)

当然整个过程最最重要的是你会看到如下信息:

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.abc.com with the following value:

9L2_ihN6Y8AefoXbTBFN7n9ydVa4k5fF3z1qT5Zi6qE

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

看到以上信息的时候不要做任何操作,你需要到你的域名DNS解析增加一条如下解析:

记录类型 主机记录 解析线路 记录值
TXT _acme-challenge 默认 9L2_ihN6Y8AefoXbTBFN7n9ydVa4k5fF3z1qT5Zi6qE

解析之后等待生效。

现在的DNS生效基本上很快,阿里云几乎在几十秒钟之内即可生效,但是不同的服务商生效时间也不一样(具体的要了解DNS的机制了,这里就不展开了)

等待一小段时间之后,我们需要通过dig命令可以验证一下解析是否生效,如果没有安装dig命令,可以使用yum install -y bind-utils安装

[root@OPS ~]# dig  -t txt  _acme-challenge.abc.com @8.8.8.8

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t txt _acme-challenge.abc.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34825
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.abc.com.   IN  TXT

;; ANSWER SECTION:
_acme-challenge.abc.com.    589 IN  TXT "9L2_ihN6Y8AefoXbTBFN7n9ydVa4k5fF3z1qT5Zi6qE"

;; Query time: 46 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon May 14 10:27:29 CST 2018
;; MSG SIZE  rcvd: 115

[root@OPS ~]# 

如上,;; ANSWER SECTION:返回了解析结果。

如果有返回结果,再回到交互,按下回车,Let’s Encrypt会验证DNS,验证通过机会办法证书。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/abc.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/abc.com/privkey.pem
   Your cert will expire on 2018-08-14. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

签证完成,证书存放目录和单域名证书一致。

续签的方式也是如此,修改DNS的TXT解析值。

2018-06-19更新


四、单域名续签

Let's Encrypt免费SSL证书有效期为90天,可以配合crontab进行续签。

certbot renew --quiet --renew-hook "/usr/local/nginx/sbin/nginx -s reload"

以上命令更新证书,--renew-hook是个钩子,证书更新完毕触发钩子执行后面的命令来重启nginx,简直是贴心周到!


五、使用python实现自动签证、续签泛域名证书

上文说到,如果要签泛域名证书必须要指定--manual参数通过交互的方式签证,Let's Encrypt会返回一个值,手动解析txt值以后发起验证,通过了验证才颁发证书,这个过程都需要人工手动操作,这当然并不是我们想要的。

经过多天的实践,我们可以利用python的pexpect库来实现自动签证和续签。代码已经用于环境上了,目前没有什么问题,但是代码写的太烂就不贴出来,这里我们讲讲思路。

Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh、ftp 、telnet 等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。

可以简单理解为linux下的expect的python实现,但是个人觉得pexpect更为强大,比如它的日志管理。

实现SSL自动签证分一下几个步骤:

  • 用pexpect发起签证请求,并且保存日志到文件。
  • pexpect匹配关键字,发送交互。
  • 匹配到返回TXT解析值,读取pexpect日志文件获取TXT值。
  • 调用DNS服务商的API接口解析(我们使用的是阿里云)
  • 通过dig命令判断解析是否生效(最好判断谷歌的DNS 8.8.8.8)
  • dig判断解析生效后发送交互让Let's Encrypt验证。
  • 验证通过判断返回,记录相关信息。

上面是大概的一个思路,在我编写脚本的过程中发现pexpect的日志只能写入到文件或者标准输出(其实应该要说只能写入到有wirte方法的对象中),所以无法保存在变量中,我用了最笨的方法:读取日志文件,来获取信息。

泛域名证书的续期和签证是一样一样的,所以不需要做特别的处理,唯一要做的就是判断是否新签证还是续签(Let's Encrypt对签证频率有限制,具体规则请看官网),我们可以通过Let's Encrypt的renew的配置的时间信息来判断,也可以自行维护过期时间(我选择了自行维护过期时间)

希望官方能出自动签泛域名的功能。


六、使用阿里云SLB遇到的问题

在不同的负载均衡中,有不同方式部署SSL证书:

  • 如果是NGINX等七层负载均衡,可以直接将证书部署在负载均衡上。
  • 如果是LVS四层负载均衡,证书需要部署在后端的Real-Server中部署。

NGINX等七层负载均衡可以直接在负载均衡服务器上使用CertBot来签证续约。

如果是采用LVS四层负载均衡的或者正在使用阿里云的业务,请继续阅读。

目前我们的业务大部分跑在阿里云上,阿里云的SLB提供了TCP和UDP的四层负载均衡,这个功能基于LVS,也提供了HTTP和HTTPS的七层负载均衡,这个功能基于淘宝的Tengine。

那么就有以下两个问题:

  1. 阿里云官方都承认七层的负载均衡性能非常差,在大流量大并发下表现非常不好。

  2. 阿里云的HTTPS负载均衡需要在负载均衡管理后台提交证书文件,然后才能选用证书,这样就无法使用CertBot自签Let's Encrypt免费SSL证书。

基于以上两点,我们决定负载均衡使用四层负载均衡,将证书部署在后端的Real-Server上。

那么问题又来了:

  1. 如何保证在业务不中断的情况下创建证书和更新证书。

  2. 如何保证每一台的Real-Sever的证书同步。

第二个问题好解决,一种是通过共享证书解决问题(例如samba),另一种方式是通过rsync这种同步软件解决问题,在证书更新的时候自动复制到每一台Real-Server。

我个人更建议使用rsync,因为如果使用共享的这种方式,比如samba,那么有可能samba会挂掉,影响到整个业务的正常访问。

第一个问题才是我们要解决的棘手问题。


七、CertBot签证过程

为了解决在集群中签的这个问题,我们先来看看CertBot的webroot的工作方式(CertBot提供了多种签证方式,但是只有webroot能在业务不停止的情况下签证)

certbot certonly --webroot -w /usr/local/nginx/html -d your.domain.com

以上是webboot的签证的命令的示例,webroot在命令提交的时候会在/usr/share/nginx/html/下创建一个.well-known的文件夹,然后Let's Encrypt通过your.domain.com域名访问到.well-known 的信息,匹配的话证明这个域名属于你的,就给颁发证书。

知道这个原理,那就好办了。

我们可以使用NGINX的代理来实现,我们可以在一台服务器上做好签证或更新(姑且把这样的一台服务器叫着SSL证书服务器,负责签证、更新证书、存储证书等),然后将证书通过rsync复制到Real-Server,经过测试此方法行得通。


八、阿里云SLB环境签证具体步骤

1.在SLB的Real-Server中配置hosts

[root@OPS ~]# echo "1.2.3.4  ssl-server" >> /etc/hosts

你也可以直接使用IP访问ssl-server,但是为了安全还是建议使用解析来访问。

2.在SLB的Real-Server中的NGINX配置文件中增加.well-known的代理,代理到SSL证书服务器上。

server {
    listen 80;
    server_name  your.domain.com;
    root /usr/local/nginx/html;
    index index.html;
    location / {
      root   html;
      index  index.html index.htm;
    }
    location /.well-known { # 匹配.well-known路径
      proxy_pass http://ssl-server;   #代理到证书服务器
    }
}

以上是Real-Server配置文件片段,将.well-known的这个目录代理到证书服务器,使Let's Encrypt能够正确识别到CertBot创建的文件。

注意:每一台Real-Server都需要配置,否则负载均衡有可能将Let's Encrypt服务器的数据扔给没有配置代理的Real-Server,这将会导致签字失败。

3.在SSL证书服务器上创建web服务,响应代理的数据

server {
  listen       80;
  server_name  ssl-server; #为了安全起见,还是使用server_name来访问
  location / {
    root   /usr/local/nginx/html;
    index  index.html index.htm;
  }
}

以上配置端是SSL证书服务器的配置,用于响应Real-Server的Let's Encrypt的数据。

这样我们就配置好了,接下来可以开始签证了。

4.签证和更新证书。

做好了以上操作,我们就开始签字或者是更新证书了。

[root@HUANG html]# certbot certonly --webroot -w /usr/local/nginx/html/ -d your.domain.com #签证
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for ssl-test.linuxops.org
Using the webroot path /usr/local/nginx/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/your.domain.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/your.domain.com/privkey.pem
   Your cert will expire on 2017-11-11. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
[root@HUANG html]# ls  /etc/letsencrypt/live/your.domain.com/fullchain.pem
/etc/letsencrypt/live/your.domain.com/fullchain.pem

从以上的信息看出签证已经成功了。

证书文件存放在/etc/letsencrypt/live/your.domain.com/,其实这个目录只是一个软连接,真正的证书文件存放在/etc/letsencrypt/archive/your.domain.com/,每一次续约成功后,证书文件的编号会增加一个,如下:

[root@OPS ~]# ls -l /etc/letsencrypt/archive/your.domain.com/
total 64
-rw-r--r-- 1 root root 1789 Nov  7 11:08 cert1.pem
-rw-r--r-- 1 root root 1789 Jan  6 22:00 cert2.pem
-rw-r--r-- 1 root root 1789 Jan 10 16:21 cert3.pem
-rw-r--r-- 1 root root 1789 Mar 19 09:52 cert4.pem
-rw-r--r-- 1 root root 1647 Nov  7 11:08 chain1.pem
-rw-r--r-- 1 root root 1647 Jan  6 22:00 chain2.pem
-rw-r--r-- 1 root root 1647 Jan 10 16:21 chain3.pem
-rw-r--r-- 1 root root 1647 Mar 19 09:52 chain4.pem
-rw-r--r-- 1 root root 3436 Nov  7 11:08 fullchain1.pem
-rw-r--r-- 1 root root 3436 Jan  6 22:00 fullchain2.pem
-rw-r--r-- 1 root root 3436 Jan 10 16:21 fullchain3.pem
-rw-r--r-- 1 root root 3436 Mar 19 09:52 fullchain4.pem
-rw-r--r-- 1 root root 1704 Nov  7 11:08 privkey1.pem
-rw-r--r-- 1 root root 1704 Jan  6 22:00 privkey2.pem
-rw-r--r-- 1 root root 1704 Jan 10 16:21 privkey3.pem
-rw-r--r-- 1 root root 1708 Mar 19 09:52 privkey4.pem

当然,每一次续约成功,/etc/letsencrypt/live/your.domain.com/下的软连接也会重新指到最新的证书上。

接下来就是要复制证书到real-server了,我们可以用rsync来同步证书。关于rsync就不详细说明了。Let's Encrypt这样做是为了没错续约的时候可以不用更改NGINX的配置。

注意:签证和更新的操作应该在SSL服务器上操作的,证书文件也会保存到SSL服务器上。


九、证书续约

Let's Encrypt免费SSL证书有效期为90天,可以配合crontab进行续签。

certbot renew --quiet --renew-hook "/bin/bash /data/script/certbot_update.sh"

以上命令更新证书,--renew-hook是个钩子,证书更新完毕触发钩子执行后面的命令你可以自己编写命令来触发NGINX重启以应用新证书,简直是贴心周到!

虽然证书的更新会自动将软连接指向到新的证书上,但是如果要应用新证书,依然需要重启删除NGINX的缓存文件并且重启。


十、证书同步

证书的签证是在一台专用服务器上完成的,我们需要将证书复制到负载均衡的Real-Server下,我们推荐使用RSYNC这样的同步软件,因为通过RSYNC同步,证书文件存放在本地Real-Server上,不会受其他因素影响。 rsync同步这里展开说明了,请大家自行百度谷歌。


十一、Let's Encrypt的一些重要问题

Let's Encrypt免费SSL证书对有效期,创建数量,创建频率,更新频率,以及访问频率都有做限制,如果用在生产环境中,请评估这些限制,具体详情可以查看官方文档。传送门

以上就是负载均衡下的CertBot自签Let's Encrypt免费SSL证书的思路和方法,如果有更好的办法请不吝赐教。