从 LetsEncrypt 获取免费的泛域名 SSL 证书

Apr 27, 2020 • 预计阅读时间 1 分钟

lvvme.com 是单域名,*.lvvme.com 是泛域名。如果自己的网站除了主域名外还有类似与 img.lvvme.com、 file.lvvme.com 之类的子域名,使用泛域名证书是比较好的选择。

LetsEncrypt 也支持泛域名证书了,申请和配置都比较简单。

获取证书

sudo apt-get install certbot

命令比较长,用脚本辅助一下 get-cert.sh

#!/bin/sh
set -e

sudo certbot --duplicate certonly -d "*.$1" -d "$1" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

get-cert.sh lvvme.com

根据提示配置好域名的 DNS,需要配置两个 TEXT 类型的记录。

提示:一定要确认 TXT 记录已经生效了再继续下一步,否则会失败,一个简单的方法是添加了 TXT 记录以后使用 dig 命令查询:

dig txt _acme-challenge.lvvme.com

查询结果可以找到 TXT 区段就说明生效了:


; <<>> DiG 9.10.6 <<>> txt _acme-challenge.lvvme.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25452
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 19

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;_acme-challenge.lvvme.com.	IN	TXT

;; ANSWER SECTION:
_acme-challenge.lvvme.com. 600	IN	TXT	"rlCEXLl8gTyv3OjV2oSm7C0A8yeAJF7RkBkbUBo2oJM"
_acme-challenge.lvvme.com. 600	IN	TXT	"tQk-UWAb6rtbFp8YxCgdWcBBcqRPj5GAhzhL9oxjA00"

都完成以后,证书就保存在 /etc/letsencrypt/live/lvvme.com 里了:

cert.pem  chain.pem  fullchain.pem  privkey.pem  README

fullchain.pemprivkey.pem 就是 Nginx 需要的公钥和私钥。

配置 Nginx

如果 Nginx 是运行在 Docker 里的话,需要注意 live/lvvme.com 目录里的文件是符号链接,实际文件保存在 archive 目录里:

cert.pem -> ../../archive/lvvme.com/cert1.pem
chain.pem -> ../../archive/lvvme.com/chain1.pem
fullchain.pem -> ../../archive/lvvme.com/fullchain1.pem
privkey.pem -> ../../archive/lvvme.com/privkey1.pem
README

nginx.conf 的配置要这么写:

http {
    ...
    listen 443 ssl http2;
    ssl_certificate     /etc/letsencrypt/live/lvvme.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/lvvme.com/privkey.pem;
    ...
}

docker 需要做 /etc/letsencrypt 的目录映射,才能正确的找到证书:

docker run -v /etc/letsencrypt:/etc/letsencrypt ...
NginxDockerUbuntu
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

移除所有 Docker 镜像

更新 Ubuntu 到最新的 LTS 版本