教程:配置 Let's Encrypt 免费 HTTPS 证书

最新更新

Certbot 更新了自动更新脚本,现在配置更简单了,基本实现全自动化。

以 Nginx 和 Ubuntu 16.04 为例:

1. 安装 certbot 软件

1
2
3
4
5
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx

2. 一键安装脚本

certbot 附带一个 nginx 插件,可以直接生成证书和写入nginx配置文件中。

1
sudo certbot --nginx

3. 自动更新

将自动更新脚本加入crontab中,每月自动更新,crontab -e 加入以下内容:

1
0 0 1 * * certbot renew

目录定义

  1. 存放验证域名的文件,即acme-dir,默认存储在/home/xxx/www/challenges/
  2. 存放最终结果证书的目录,如本文中的/data/ssl

存放验证域名文件的目录

1
2
3
4
5
     mkdir ~/www/challenges/
```

然后配置一个 HTTP 服务,以 Nginx 为例:

NGINX
server {
    server_name www.yoursite.com yoursite.com;

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

    location / {
        rewrite ^/(.*)$ https://yoursite.com/$1 permanent;
    }
}
1
2
3
4
 
然后重启nginx。
```  
sudo service nginx reload

创建存放证书的目录

1
2
mkdir /data/ssl
cd /data/ssl

创建一个 RSA 私钥用于 Let’s Encrypt 识别你的身份

1
openssl genrsa 4096 > account.key

创建 RSA 私钥(兼容性好)

1
openssl genrsa 4096 > domain.key

Common Name 必须为你的域名,其它的随便填

1
openssl req -new -sha256 -key domain.key -out domain.csr

获取脚本

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

指定账户私钥、CSR 以及验证目录,执行脚本:

1
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /home/xxx/www/challenges/ > ./signed.crt

如果一切正常,当前目录下就会生成一个 signed.crt,这就是申请好的证书文件。

证书融合

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

ssl配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 443;
server_name www.text.wiki;
root /data/htdocs/textwiki;
autoindex on;
index index.php index.html;
ssl on;
ssl_certificate /data/ssl/chained.pem;
ssl_certificate_key /data/ssl/domain.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_trusted_certificate /data/ssl/full_chained.pem;

location / {
try_files $uri $uri/ /index.php;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME /data/htdocs/textwiki$fastcgi_script_name;
include fastcgi_params;
}
}
}

自动更新脚本

1.新建文件vi renew_cert.sh

2.填写如下内容

1
2
3
4
5
6
7
8
    #!/bin/bash
   cd /data/ssl/
python acme_tiny.py --account-key account.key --csr domain.csr --acme-dir /home/xxx/www/challenges/ > signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem
service nginx reload

3.chmod +x renew_cert.sh

加入crontab

crontab 中加入自动更新脚本,每月自动更新,crontab -e 加入以下内容:

1
0 0 1 * * /data/ssl/renew_cert.sh >/dev/null 2>&1

最关键的是,如果服务器有防火墙,请放开服务器的443入口

说明

本文注重实战,跟着教程一步一步配置即可,想了解原理的同学,可以参考如下网址:
Let’s Encrypt官网
Let’s Encrypt,免费好用的 HTTPS 证书
Let’s Encrypt 给网站加 HTTPS 完全指南

作者

David

发布于

2017-03-29

更新于

2023-10-22

许可协议

评论

:D 一言句子获取中...