LetsEncrypt SSL 证书签发(Nginx)

概述

官方文档参考: let’s encrypt getting started

域名认证过程有自动认证与手动认证,自动认证会启动一个监听 80 端口的程序来完成自动认证。手动认证使用参数 --webroot 来进行使用网站访问手动认证,认证时,会访问网址 /.well-known/acme-challenge/xxxxxxxx

每次签发的证书有 90 天的有效期,所以我们还得在每个月去重新签发一个新的证书。

本文的操作是基于系统 CentOS 6.7 操作进行。

准备工作

在取得官方代码前,得先查看系统环境中是否安装全所需要的工具软件。

  • Git
yum -y install git
  • python 2.7 检查
/usr/bin/python -V #查看版本
  • 安装编译需要的工具
yum install zlib-devel bzip2-devel openssl-devel xz-libs wget xz 
  • 安装 Python2.7.8
wget http://www.python.org/ftp/python/2.7.8/Python-2.7.8.tar.xz  
xz -d Python-2.7.8.tar #下载源码
tar -xvf Python-2.7.8.tar #解压
cd Python-2.7.8 #进入目录
./configure --prefix=/usr/local #运行配置
make
make altinstall #编译及安装
python2.7 -V #检查版本
export PATH="/usr/local/bin:$PATH" 
cd ../ 
  • 安装 pip 及 virtualenv
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz #下载源码
tar -xvf setuptools-1.4.2.tar.gz #解压 
cd setuptools-1.4.2
python2.7 setup.py install #用 Python2.7.8安装setuptools
cd ../

curl https://bootstrap.pypa.io/get-pip.py | python2.7 -   #安装pip
pip2.7 install virtualenv   #安装virtualenv

域名认证并生成证书

  • 从官方 Git 库中取得代码。
git clone https://github.com/letsencrypt/letsencrypt  
cd letsencrypt  
  • 自动认证 standalone 模式

运行认证程序。

service nginx stop #停止 Nginx 服务器
./letsencrypt-auto certonly --standalone -d ixiaozhi.com -d www.ixiaozhi.com

letsencrypt-auto 按照提示输入 E-mail 和域名即可。在运行认证程序前,要先停用 nginx,因为接下来的环节需要占用80等端口。之后证书会生成到 /etc/letsencrypt/live/ixiaozhi.com/ 下,其中的 ixiaozhi.com 改为自己的域名。

  • 手动认证 webroot 模式

Nginx 添加目录访问:

location /.well-known/acme-challenge/ {
    default_type text/plain;
    root /home/ixiaozhi/acme-challenge/;
}

添加目录,并重启服务:

cd /home/ixiaozhi/
mkdir acme-challenge
service nginx restart

进行认证并生成证书:

service nginx reload

./letsencrypt-auto certonly --webroot -w /home/ixiaozhi/acme-challenge -d ixiaozhi.com -d www.ixiaozhi.com

认真阅读输出信息,输入邮箱且同意协议后,成功后会输出:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/ixiaozhi.com/fullchain.pem. Your cert will
   expire on 2016-05-29. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If you 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

看到 Congratulations 我们就放心了。之后证书会生成到 /etc/letsencrypt/live/ixiaozhi.com/ 下。

配置 Nginx

修改 Nginx 的 nginx.conf,添加配置 ssl。

listen 80;
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
server_name ixiaozhi.com;

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

重启 nginx 即可。

定时任务定时签发证书

我们可以先测试一个 renew 证书是否可以成功。

./letsencrypt-auto renew --email admin@ixiaozhi.com --dry-run --agree-tos

当看到 Congratulations, all renewals succeeded. The following certs have been renewed 时,测试就是通过的。使用 --dry-run 参数来测试并不会保存任何证书。

如果需要自动更新,先使用“crontab -e”,选择编辑器后,在最底部加入

0 0 1 * * ./letsencrypt-auto renew --email admin@ixiaozhi.com --agree-tos  --force-renewal 

crontab 的时间格式为:

*  *  *  *  *  command
分  时  日  月  周    命令

添加成功后,可以使用 crontab -l 查看当前用户的定时任务,确认是否已经生效。

转发设置

如果希望访问 http 都跳转至 https 进行访问,可以通过两种方法进行转发。(如果是使用 –webroot 进行认证的,在 nginx 设置中要把 /.well-known/acme-challenge/ 例外不进行转发)

一个是直接利用 nginx 进行转发。

server {  
    listen 80;
    server_name ixiaozhi.com;
    return https://ixiaozhi.com$request_uri;

...

一个是设置HSTS。

server {
    add_header Strict-Transport-Security "max-age=63072000;includeSubdomains; preload";  
    #添加一行
    ...

别忘了上述设置都需要重启 Nginx。

参考资料