1、首先要安装pthon2.7+版本,因为Let's Encrypt需要在python2.7+版本的环境上运行,安装方法:CentOS下源码包编译安装

Python-2.7.8 ,不然会报如下错误:
    Traceback (most recent call last):
      File "acme_tiny.py", line 2, in <module>
        import argparse, subprocess, json, os, sys, base64, binascii, time, hashlib, re, copy, textwrap, logging
    ImportError: No module named argparse

2、配置验证的http服务,在nginx域名配置文件里面加入(/opt/nginx/conf.d/search.kyzy.cc.conf)

location ^~ /.well-known/acme-challenge/ {
    alias /var/www/html/ssl_check_file/;
}

一定要注意,想要给几个域名加ssl就要在哪个域名的配置里面面增加,也就是多个域名(包括二级子域名)就要在多个域名下的配置文件里面增加这个配置

3、创建目录

cd /var/www/html
mkdir ssl_check_file
chown -R www:www ssl_check_file

4、创建帐号(建个ssl目录,之后的操作及生成的证书文件等都在该目录。进入该目录,创建一个RSA私钥用于Let's Encrypt识别你的身份)

mkdir -p /var/www/html/ssl
cd /var/www/html/ssl
openssl genrsa 4096 > account.key

5、创建RSA私钥(兼容性好)

openssl genrsa 4096 > domain.key

6、生成CSR文件(openssl.cnf可以使用命令find / -name openssl.cnf来找到位置)

openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:kyzy.cc,DNS:www.kyzy.cc")) > domain.csr

7、获取网站证书、下载acme-tiny脚本

wget --no-check-certificate https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

8、指定账户私钥、CSR 以及验证目录(前面nginx配置的验证目录),一定要与【步骤2】中的地址相同/var/www/html/ssl_check_file/

python27 acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/html/ssl_check_file/ > ./signed.crt

成功后如下图:
请输入图片描述

【注意:报出如下错误,是因为在编译安装python时系统中没有openssl库】

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python27/lib/python2.7/urllib.py", line 86, in urlopen
    return opener.open(url)
  File "/usr/local/python27/lib/python2.7/urllib.py", line 204, in open
    return self.open_unknown(fullurl, data)
  File "/usr/local/python27/lib/python2.7/urllib.py", line 216, in open_unknown
    raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: 'https'

安装

sudo yum install openssl-devel

【注意:报出如下错误,可以修改脚本代码】

> ValueError: Wrote file to /home/xxx/www/challenges/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg, but couldn't download http://www.yoursite.com/.well-known/acme-challenge/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg

找到

try:
    resp = urlopen(wellknown_url)
    resp_data = resp.read().decode('utf8').strip()
    assert resp_data == keyauthorization
except (IOError, AssertionError):
    os.remove(wellknown_path)
    raise ValueError("Wrote file to {0}, but couldn't download {1}".format(
wellknown_path, wellknown_url))

注释掉或者删除(如果次数多几次也会出现这个错误,而且是大多数是这个错误,等几小时再操作)

9、搞定网站证书后,还要下载 Let's Encrypt 的中间证书。在 Nginx 配置中,需要把中间证书和网站证书合在一起

cd /var/www/html/ssl
wget --no-check-certificate -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

10、为了后续能顺利启用 OCSP Stapling,我们再把根证书和中间证书合在一起

wget --no-check-certificate -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem

11、配置nginx(/opt/nginx/conf/nginx.conf),加入下面两行

ssl_certificate     /var/www/html/ssl/chained.pem;
ssl_certificate_key /var/www/html/ssl/domain.key;

12、配置nginx(/opt/nginx/conf.d/search.kyzy.cc.conf) http 301跳转到https

找到

listen     80;

在下面增加

listen     443 ssl;

在配置里面再加一段跳转

if ($server_port != '443')
{
    return 301 https://$server_name$request_uri;
}

最终如下图
请输入图片描述

13、Let's Encrypt 签发的证书只有 90 天有效期,推荐使用脚本定期更新。所以需要创建一个脚本来自动签发证书。

vi renew_cert.sh

内容如下:

#!/bin/bash

cd /usr/local/src/
python27 acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/html/ssl_check_file/ > ./signed.crt
wget --no-check-certificate -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

设置为可执行

cd /var/www
chown -R www:www html
chmod a+x renew_cert.sh

设置计划任务自动签发证书

crontab -e

每月1号凌晨更新HTTPS证书

0  0  1  *  *  /usr/local/bin/renew_cert.sh >/dev/null 2>&1

想要给腾讯CDN使用?
signed.crt文件内容全部copy到腾讯CDN的证书内容里面。
domain.key文件内容全部copy到腾讯CDN的私钥内容里面。