Let's Encrypt生成免费证书

要在您的网站上启用HTTPS,您需要从证书颁发机构(Certificate Authority)(CA)获取证书(一种文件类型)。Let’s Encrypt就是一个证书颁发机构。为了从Let’s Encrypt获得您网站域名的证书,您必须证明对该域名的控制权。使用Let’s Encrypt,您可以使用使用ACME协议的软件来执行此操作,该协议通常在您的Web主机上运行。
建议大多数使用shell访问的人使用 Certbot ACME客户端。它可以自动执行证书颁发和安装,而不会停机。

Cerbot安装

在centos7上使用nginx情况下,certbot安装流程如下:

1
2
$ yum -y install yum-utils
$ yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
1
$ sudo yum install certbot-nginx

具体安装流程可见:certbot homecertbot installation

Certbot生成证书

1
$ certbot certonly --nginx --nginx-server-root /path/to/nginx_server_root -d www.example.com -d example.com --email email_address --agree-tos

详情请见: certbot installationget certbot

生成证书成功后默认证书路径为:
certificate and chain: /etc/letsencrypt/live/example.com/fullchain.pem
key file: /etc/letsencrypt/live/example.com/privkey.pem

证书过期问题

Let’s Encrypt CA发行的是短期证书(90天),所以需要确保3个月内至少更新一次证书。
解决方法如下:
使用crontab创建定时任务,执行下列脚本:
renew.sh:

1
2
3
4
# !/bin/bash
certbot certonly --nginx --nginx-server-root /usr/local/nginx/conf/ -d www.leeyf.cc -d leeyf.cc --email 664275973@qq.com -n --force-renewal

/path/to/nginx -s reload

certbot更新证书详情请见:certbot renewing certificates

创建定时任务,每月都更新一次证书:

1
42 4 1 * * /path/to/renew.sh >> /path/to/renew.log 2>&1

Crontab

时间表格式: f1 f2 f3 f4 f5 program

  • 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
  • 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推
  • 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
  • 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推
  • 当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其余类推,使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。
  • 由于unix版本不一样,所以部分语法有差别,例如在hp unix aix 中设定间隔执行如果采用*/n 方式将出现语法错误,在这类unix中 ,间隔执行只能以列举方式。

Nginx配置https

关键示例配置:

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

server {
listen 443 ssl;
server_name www.example.com;
ssl on;
ssl_certificate_key /path/to/ssl_certificate_key;
ssl_certificate /path/to/ssl_certificate;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
access_log /path/to/access.log combined;
index index.html index.htm index.php;
root /path/to/project_root;
...
}

配置完成后,重启nginx服务:

1
$ /path/to/nginx -t
1
$ /path/to/nginx -s reload

nginx -t 检查nginx配置文件是否正确。
nginx -s reload 平滑重启nginx