證書除了可以選擇自簽之外,還有一些免費證書可以申請,比較流行的有 Let's Encrypt 。使用工具申請證書會方便許多(當然也可以手動),申請工具就有很多了,有 Certbotacme.sh,這裡選擇 acme.sh 進行演示。


# acme.sh 容器安裝

  1. 安裝 acme.sh 容器
docker pull neilpang/acme.sh
docker run -it  \
    --net=host \
    --name=acme \
    -v /home/docker/acme:/acme.sh  \
    neilpang/acme.sh  daemon

/home/docker/acme 這個路徑是申請完成之後證書存放的路徑,可根據需求進行修改
daemon 此選項是用於守護進程,如果使用自動續簽證書會用到,這裡暫不展開討論

# 更改默認簽發機構為 Let's Encrypt

繼 acme.sh 被商業收購之後,官方文檔已明確說明更換默認證書辦法機構為 ZeroSSL(此前為 Let's Encrypt),雖然對一般使用者來說並不會產生影響,甚至 ZeroSSL 還比 Let's Encrypt 提供了更完善的 API。
但個人還是更傾向於網際網路安全研究小組(ISRG)運營的 Let's Encrypt,畢竟一個是由非盈利機構運營,另一個則是商業公司運營。

  1. 更改默認簽發機構為 Let's Encrypt
docker exec -it acme --set-default-ca --server letsencrypt

# DNS 手動模式申請證書

  1. 第一次先執行
acme.sh --issue -d *.example.com --dns \
    --yes-I-know-dns-manual-mode-enough-go-ahead-please

*.example.com : 其中的 * 是萬用字元,用於申請 example.com 域名的泛域名證書
--yes-I-know-dns-manual-mode-enough-go-ahead-please : 後面這一句不能去掉,要一起執行,否則會報錯的

  1. 命令執行完成後會在終端打印用於添加 TXT 記錄的「名稱」和「內容」,根據剛才打印的內容添加申請證書域名的 TXT 記錄,等待解析生效

  2. 可用以下命令驗證解析是否生效

nslookup -type=txt example.com

其中 example.com 更換為添加 TXT 解析記錄的域名

  1. 確認 TXT 解析記錄生效後,以 --renew 重新執行命令
acme.sh --renew -d *.example.com \ 
    --yes-I-know-dns-manual-mode-enough-go-ahead-please
  1. 命令執行完成後,會在之前設定的 /home/docker/acme 路徑下生成證書 fullchain.cer 和密鑰 example.com.key 檔案