让网站用上免费 SSL 证书(Let's Encrypt)
原创大约 3 分钟...
Let's Encrypt 是免费、开放和自动化的证书颁发机构。由非盈利组织互联网安全研究小组(ISRG)运营。支持单个域名或通配符域名的证书颁发。
申请 Let's Encrypt 证书
Let’s Encrypt 使用 ACME 协议来验证您对给定域名的控制权并向您颁发证书。 要获得 Let’s Encrypt 证书,您需要选择一个要使用的 ACME 客户端软件。
这里我选用 certbot 来签发证书,详细使用可以参考官方文档。
certbot 命令行参数: Certbot Command-line options
下面演示通过 docker 来使用 certbot,先看用到的 2 个脚本文件,分别用于颁发和续签证书:
创建所需的脚本文件
颁发: certbot_only.sh
- 这里只需通过 -d 设置你的域名即可,可以 -d 多次设置多个域名, 如: 单个域名
-d wap.example.com
或者多个-d a.example.com -d b.example.com -d wap.abcde.com
。 - 申请通配符证书时除了
-d *.example.com
外,一般还需要带上主域名-d example.com
。
#!/usr/bin/env sh
cur_dir=$(
cd "$(dirname $0)"
pwd
)
docker run -it --rm \
-v "$cur_dir"/etc.letsencrypt:/etc/letsencrypt \
-v "$cur_dir"/var.log.letsencrypt:/var/log/letsencrypt \
-v "$cur_dir"/var.lib.letsencrypt:/var/lib/letsencrypt \
-v "$cur_dir"/data.letsencrypt:/data/letsencrypt \
certbot/certbot certonly \
--manual \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory \
-m {你的邮箱} \
-d "{你的通配符域名,如 :*.mydomain.cn}" \
-d "{你的主域名,如: mydomain.cn}" \
-d "{你的另一个域名,如: abcde.com}" \
-d "{你的另一个域名,如: aaabbb.com}"
续签: certbot_renew.sh
这里不需要做修改,只需每天至少执行一次即可。
#!/usr/bin/env sh
cur_dir=$(
cd "$(dirname $0)"
pwd
)
docker run -it --rm \
-v "$cur_dir"/etc.letsencrypt:/etc/letsencrypt \
-v "$cur_dir"/var.log.letsencrypt:/var/log/letsencrypt \
-v "$cur_dir"/var.lib.letsencrypt:/var/lib/letsencrypt \
-v "$cur_dir"/data.letsencrypt:/data/letsencrypt \
certbot/certbot renew
使用上述脚本进行颁发和续签
颁发
# 颁发
sh ./certbot_only.sh
颁发成功会输出证书路径:
/etc/letsencrypt/live/you.cn/fullchain.pem
/etc/letsencrypt/live/you.cn/privkey.pem
由于这里我们用的是 docker , 所以上述证书路径是相对于 docker 的容器根目录的,实际的证书路径需要换成:
{当前目录}/etc.letsencrypt/live/you.cn/fullchain.pem
{当前目录}/etc.letsencrypt/live/you.cn/privkey.pem
把上述证书路径放到 nginx 配置文件中即可,如下:
server {
...
ssl_certificate /etc/letsencrypt/live/you.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/you.cn/privkey.pem;
...
续签
续签, 配置 crontab 每天定时执行一次即可
sh ./certbot_renew.sh
续签成功后记得重载 nginx 配置
nginx -s reload