let's Encrypt的使用以及nginx的http2的配置

本文大量参考了Jerry Qu的博客
Let’s Encrypt,免费好用的 HTTPS 证书

创建工作目录

1
2
mkdir ssl
cd ssl/

创建本地密钥

这里集中不同的密钥,注意区分
用户密钥

1
openssl genrsa 4096 > account.key

域名密钥

1
openssl genrsa 4096 > git.letus.club.key

生成csr证书请求文件
交互模式生成

1
openssl req -new -sha256 -key git.letus.club.key -out git.letus.club.csr

按照提示信息填写相关信息:默认不进行填写也可以
生成的csr文件的开头是

1
-----BEGIN CERTIFICATE REQUEST-----

域名配置验证服务

在进行证书签名的时候证书机构需要知道你拥有这个域名的所有权,类似于谷歌站长的验证方式

配置nginx的验证目录

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name git.letus.club;

location ^~ /.well-known/acme-challenge/ {
alias /var/challenges/;
try_files $uri =404;
}

location / {
rewrite ^/(.*)$ https://git.letus.club/$1 permanent;
}
}

下载脚本,获取验证过的网站证书

1
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

验证并获取证书文件

1
2
3
python acme_tiny.py --account-key ./account.key \
--csr ./git.letus.club.csr \
--acme-dir /root/challenges/ > ./signed.crt

执行脚本的时候python库可能缺少,需要安装

1
yum install python-argparse

上面的acme_tiny.py脚本输出

1
2
3
4
5
6
7
8
Parsing account key...
Parsing CSR...
Registering account...
Already registered!
Verifying git.letus.club...
git.letus.club verified!
Signing certificate...
Certificate signed!

这个过程需要验证服务是否可用
所以保证通过指定域名能够访问文件
nginx里的alias指向的地址跟指定的acme-dir地址应该一致,并且保证有相关权限
生成一个crt文件,文件开头是:

1
-----BEGIN CERTIFICATE-----

获取上级证书并组成证书链

1
2
3
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem \
> intermediate.pem
cat signed.crt intermediate.pem > chained.pem

到这里就配置成功了证书文件了

nginx的http2配置

一个完成的配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 443 ssl http2;
server_name git.letus.club
ssl on;

ssl_certificate /root/ssl/chained.pem;
ssl_certificate_key /root/ssl/git.letus.club.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

location = /50x.html {
root /usr/share/nginx/html;
}
}

然后重启nginx
访问git.letus.club网址查看证书:
"网站证书"