免费,自动的证书授权中心 Let’s Encrypt

配置HTTPS需要的从授权证书中心(CertificateAuthority)签发被浏览器认可的证书,而大部分CA证书是需要收费的,单域名证书相对比较便宜,但是如果是多域名的情况下就需要重复购买证书或者购买多域名证书,这样需要花费的支出对于个人网站来说并不算少。

Let’s Encrypt 是一个免费提供SSL证书的CA,虽然每次签发的证书有效期都只有三个月,但是发证是自动化的,发证速度较快,并且可以通过脚本来自动续签,为个人网站使用HTTPS提供了一个不错的选择。

Let’s Encrypt (以下简称LE)的证书签发主要使用基于 ACME协议 的证书自动管理客户端来实现。

LE官方推荐的客户端是 Certbot ,本文中就是使用 Certbot 来获取和续签证书。

LE如何自动签发证书

undefined

假设现在要申请CA证书的域名是example.com

首先由WebServer(也就是我们用户端的服务器)的管理客户端(如Certbot)发送请求到LE,让LE来验证客户端是否真的控制example.com这个域名,接下来LE会提出一些验证动作(原文challenges),比如让客户端在一个很明显的路径上放指定的文件(如上图所示)。同时,LE还会发出一个随机数,客户端需要用这个随机数和客户端自己的私钥来进行签名。

undefined

如上图所示,WebServer上的客户端完成LE指定的域名验证动作并且将加密后的签名后,再次发送请求到LE要求验证,LE会验证发回来的签名是否正确,并且验证域名验证动作是否完成,如下载指定的文件并且判断文件里面的内容是否符合要求。

这些验证都完成以后,可以申请证书了。

undefined

完成验证后,客户端生成自己的私钥以及 Certificate Signing Request(CSR) 发送到LE服务器,LE服务器会将CA证书(也是公钥)发放到你的服务器。

这样就完成了CA证书的自动化发放了。

使用Certbot获取LE证书以及自动续签

Certbot就是上文中提到的ACME客户端,使用它可以很方便地完成上面所提到的这些步骤。

Certbot官网也有很简单完整的使用教程,在 https://certbot.eff.org/ 首页选择自己的服务器以及操作系统后,就能够看到操作的步骤。

这里以我自己的服务器环境(Nginx + CentOS7)举例:

yum install certbot
certbot certonly

直接使用yum安装(也可以直接下载源码进行编译安装,然后执行certbot-auto certonly,操作应该是类似的,详情查看官网)后执行 certbot certonly

undefined

执行后会进入一个很难看的GUI交互界面(我一开始没反应过来还以为蓝屏了orz),另外不想使用这个GUI模式应该也可以使用官方教程中的直接命令操作模式,不过我个人觉得这个GUI虽然难看点,但还算是操作简单。

说一下操作步骤:

1、选择webroot验证模式,也就是将文件放到网站根目录,如果Nginx做了rewrite的话这里可能需要调整一下Nginx的配置,让它可以正常访问根目录下的.well-known目录。standalone模式看起来比较麻烦我没试…

2、输入自己的常用邮箱,用来接收通知和恢复密钥。

3、同意使用协议

4、输入需要做授权的域名,多个域名用空格隔开。

5、输入域名对应的根目录路径,如果多个域名的话,就按照提示按顺序输入。

6、等待验证通过。

验证通过以后会在/etc/letsencrypt/live/yourdomain.com/下生成四个文件:

  • cert.pem : 公钥,服务器证书
  • chain.pem : 中间证书
  • fullchain.pem : 前两个的合集
  • privkey.pem : 私钥

配置nginx的时候只要用fullchain.pem和privkey.pem即可,配置示例如下:

server {
    listen       443 ssl;
    server_name www.cngal.org;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/www.cngal.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.cngal.org/privkey.pem;

    ....
}

这样就完成了ssl的配置了 :)

证书有效期是3个月,续签只需要执行以下这一句就可以了,不需要再输入那么多信息(会续签所有证书)。

certbot renew

将这一句加入到crontab就可以完成自动续签的动作~