Let's Encrypt的https证书申请及安装(nginx)
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的私钥内容
里面。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭