在本文档中,我将简述如何使用Let’s Encrypt来获得一个免费的SSL证书, 并且配置相应的Nginx,我们还将向您展示如何自动更新您的SSL证书。如果你运行一个不同的web服务器,只需遵循您的web服务器文档了解如何使用证书和你的设置。

  • Let’s Encrypt简介
  • 准备工作
  • 使用Standalone插件运行letsencrypt
  • 使用Webroot插件运行letsencrypt
  • 创建Let’s Encrypt配置文件
  • 创建自动更新脚本

Let’s Encrypt简介

Let’s Encrypt是一个新的证书颁发机构(CA),提供了一种简便的方法来获取和安装免费的TLS / SSL证书,从而使加密 的HTTPS在web服务器上。它通过提供一个软件客户端letsencrypt简化了过程,试图自动化大多数所需的步骤。目前,
Let’s Encrypt仍在开放测试,整个过程的获取和安装证书只在Apache web服务器是完全自动的。但是,我们仍然可以 可以通过手动安装的方式,无论你选择的是哪一个web服务器, 用Let’s Encrypt都可以很容易获得一个免费的SSL证书。

https://letsencrypt.org/


准备工作

在使用文档前,你必须要确认一下几点:

  • 拥有一台linux服务器,并且如果不是root用户必须具有sudo权限
  • linux服务器上安装了nginx和git
  • 拥有注册域名,因为加密是验证你的域名颁发证书,生成证书的时候会需要填写
  • 拥有一个邮箱,生成证书的时候会需要填写

使用Standalone插件运行letsencrypt

1. 安装Let’s Encrypt客户端

第一步安装Let’s Encrypt的客户端letsencrypt在你的服务器上,用来获取SSL证书。目前,最好的安装Let’s Encrypt客户端的方法就是从官方GitHub库克隆它。在以后,它可能会通过一个软件包管理器安装。

1
$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

2. 获取一个证书

Let’s Encrypt提供了多种方式来获取SSL证书,通过各种插件。大多数的插件只会帮助你获得一个证书,你必须手动配置你的web服务器来使用。这些插件获取证书并且不需要安装,被称为“身份验证器”,因为它们只用于验证服务器是否应该颁发一个证书。下面将展示如何使用Standalone插件来获取SSL证书。

Standalone插件提供了一个非常简单的方法来获取SSL证书。它通过暂时运行一个小型的web服务器,在你服务器的80端口上,让我们的Let’s Encrypt CA可以连接并验证你的服务器,判断身份是否颁发证书。因此,这种方法要求80端口不能被占用。也就是说,在使用这个插件之前一定要停止你正常的web服务器(如果你的web服务器使用的端口是80(http)的话)。例如,如果你正在使用Nginx,你可以通过以下命令停止它:

1
$ sudo service nginx stop

如果你还是不确定的话,可以使用以下命令验证80端口是被占用

1
$ netstat -na | grep ':80.*LISTEN'

3. 运行Let’s Encrypt

在使用Let’s Encrypt之前,我们先进入到letsencrypt目录:

1
$ cd /opt/letsencrypt

现在通过以下命令使用Standalone插件运行:

1
$ ./letsencrypt-auto certonly --standalone

在letsencrypt初始化后,如果你是第一次获取证书,将需要填写一些信息。

填写一个邮件地址,用于通知和遗失钥匙的恢复

示例图
示例图

然后询问是否同意Let’s Encrypt的使用条款,选择同意

示例图
示例图

然后输入你的域名,如果想要一个证书适用于多个域名,那必须把所有的域名都填写上

示例图
示例图

如果一切顺利,你应该看到这样一个输出消息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Output:
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to sammy@digitalocean.com
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-15. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
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 Let's
Encrypt so making regular backups of this folder is ideal.
- If like Let's Encrypt, please consider supporting our work by:

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

获得证书后,你将有以下PEM文件:

  • cert.pem: 你的域名证书
  • chain.pem: Let’s Encrypt的证书
  • fullchain.pem: cert.pem和chain.pem合并的证书
  • privkey.pem: 你的证书的私钥

你可以通过以下命令查看你的证书目录:

1
$ sudo ls /etc/letsencrypt/live/your_domain_name

4. 配置Web Server (Nginx)的TLS/SSL

现在你有一个SSL证书,你需要配置你的web服务器来使用它。下面将演示如何配置Nginx web服务器使用证书。如果你使用的是不同的web服务器,您需要参考相关如何设置SSL证书的文档。

1
$ sudo vi /etc/nginx/conf.d/nginx-example.conf

增加server配置,监听SSL的443端口,并且配置SSL证书。然后修改server监听的80端口重定向到https的443端口上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server   {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
server_name example.com www.example.com;

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

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
}

配置好Nginx的SSL后保存退出,然后重启Nginx。之后就可以访问站点测试一下HTTPS是不是已经开始工作了

1
$ sudo service nginx restart

使用Webroot插件运行letsencrypt

现在,我们将使用Webroot插件运行letsencrypt,相比使用Standalone插件,它不需要停止你的web服务器,它可以通过你的web服务器来验证你的域名。Webroot插件添加一个隐藏的文件到你的web服务器的文档根目录,让加密的CA可以读取并且验证你的域名。

Webroot插件通过放置一个特殊的文件/.well-known在你的文档根目录,使得Let’s Encrypt可以通过web服务器验证加密服务。所以你需要显式的允许/.well-known的访问,确保能够正常的加密验证。所以让我们迅速改变一下Nginx的配置。

1
$ sudo vi /etc/nginx/conf.d/nginx-example.conf

编辑Nginx关于SSL的server配置,增加以下代码:

1
2
3
location ~ /.well-known {
allow all;
}

修改玩Nginx配置后需要重新加载

1
$ sudo service nginx reload

使用Webroot插件,你必须要知道你的web服务器文档的根目录,你如果不清楚可以去查找相关的配置。在Nginx下,如果你没有修改过的话,文档的根目录地址是/usr/share/nginx/html。现在我们知道了web服务器的文档根目录(webroot-path),我们就可以通过以下面命令来使用Webroot插件生成我们的证书,在这里,我们使用- d指定域名。

1
2
$ cd /opt/letsencrypt
$ ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com

成功后,你将需要重新加载Nginx服务来使用新的证书:

1
$ sudo service nginx reload

创建Let’s Encrypt配置文件

上面文档中,我们通过Webroot插件来生成我们的证书,现在让我们简化一下更新过程,我们创建一个加密配置文件/usr/local/etc/le-renew-webroot.ini

1
$ sudo cp /opt/letsencrypt/examples/cli.ini /usr/local/etc/le-renew-webroot.ini

现在我们打开并且编辑这个配置文件:

1
$ sudo vi /usr/local/etc/le-renew-webroot.ini

接下来,取消email, domainswebroot-path的注释,用你自己的信息去更新。完成后大概是这样的:

1
2
3
4
5
6
7
rsa-key-size = 4096

email = you@example.com

domains = example.com, www.example.com

webroot-path = /usr/share/nginx/html

现在,我们不需要指定webroot-path的路径和-d域名的信息了,我们可以指向加密配置文件来完成证书的更新。假设你的配置文件是正确的,下面的命令将更新我们的证书:

1
2
$ cd /opt/letsencrypt
$ ./letsencrypt-auto certonly -a webroot --renew-by-default --config /usr/local/etc/le-renew-webroot.ini

重新加载Nginx服务来验证一下吧:

1
$ sudo service nginx reload

创建自动更新脚本

使用Let’s Encrypt获取的加密证书有效期为90天,也就是说我们不得不在证书快到期的时候来手动更新一下证书。这样的工作是繁琐的,并且容易遗忘。所以,我们试想一下,我们已经简化了很多更新证书的工作,接下来我们是不是可以通过一个自动化脚本来完成这重复的劳动工作呢。答案是肯定的,在linux服务器上,我们可以通过cron job来设置自动更新脚本的运行周期,我们把这个运行周期设置为当检查到证书有效期不足30天时,我们每周去执行及脚本更新一下证书。我们这样设置可以确保我们的证书在过期之前即使有一个cron job失败了,我们仍有30天的时间可以让我们每周再试一次。

首先,我们下载一个自动更新脚本,并且设置为可执行

1
2
$ sudo curl -L -o /usr/local/sbin/le-renew-webroot https://gist.githubusercontent.com/thisismitch/e1b603165523df66d5cc/raw/fbffbf358e96110d5566f13677d9bd5f4f65794c/le-renew-webroot
$ sudo chmod +x /usr/local/sbin/le-renew-webroot

备注:如果你的服务器是Redhat,那么请将文件放到/sbin目录下,例如:

1
2
$ sudo curl -L -o /sbin/le-renew-webroot https://gist.githubusercontent.com/thisismitch/e1b603165523df66d5cc/raw/fbffbf358e96110d5566f13677d9bd5f4f65794c/le-renew-webroot
$ sudo chmod +x /sbin/le-renew-webroot

注意:如果/usr/local/etc/le-renew-webroot.ini配置不存在,这个脚本将不会运行。另外,确保在配置文件中指定的第一个域名和你最初创建证书的时候指定的域名是相同的。

现在,如果你运行这个脚本,你将能够看到当前的证书还有多少天到期:

1
$ sudo le-renew-webroot
1
2
3
output
Checking expiration date for example.com...
The certificate is up to date, no need for renewal (89 days left).

接下来,我们将编辑crontab来创建一个新作业,并且将每周运行这个命令。

1
$ sudo crontab -e

添加下面一行代码:

1
30 2 * * 1 /usr/local/sbin/le-renew-webroot >> /var/log/le-renewal.log

保存并退出,这将创建一个新的cron作业,我们设定为每周一凌晨2点30分执行le-renew-webroot命令。命令产生的输出将被写入/var/log/le-renewal.log日志中。