跳到主要內容

Let's Encrypt SSL/TLS 憑證申請紀錄

現在 HTTPS 已經是網站的標準要求了
如果不想花錢買付費憑證,那麼免費的 Let's Encrypt 是個很好的選擇
以下紀錄如何在 Linux 完成憑證申請,並且套用自動更新

首先安裝官方推薦的工具 certbot-auto
這是把 certbot 再包裝過的 script 工具
如果有打算搭配 web server 的管理相關目錄使用
建議可以先 cd 到該目錄再安裝 certbot-auto
當然安裝完後再把 certbot-auto 移過去也可以啦

安裝指令,以官網原文為準,注意是看 certbot-auto 而不是 certbot
sudo wget https://dl.eff.org/certbot-auto
sudo chmod a+x ./certbot-auto

安裝完後就準備開始申請了
先說下雖然也可以用 wildcard 申請
也就是 *.foo.com 這樣帶有萬用字元 * 的網域名稱申請
不過這篇設定將不會考量 wildcard 網域

wildcard的好處是如果你有自訂網域會方便很多
即使之後增加配置了 blog.foo.com、api.foo.com 等等網域
也可以不用再多申請或調整使用中的 TLS 憑證

不過問題是目前 Let's Encrypt 官方並不支援使用 wildcard 的憑證的自動更新
而且 Let's Encrypt 憑證的有限期限是90天
得注意在到期前手動再重跑程序
如果你負責營運商業網站
一定不會想冒因為忘記而讓網站憑證失效的風險
如果很想用 wildcard,也許該考慮的是付費買其他的有效時間長的 wildcard 憑證

申請前還有一個地方得注意
我們要讓 certbot 能夠驗證網域的有效性
他的驗證方式是在指定目錄(通常選網頁根目錄)下產生 .well-known/acme-challenge 目錄
並且在裡面產生任意名稱的檔案
之後他的驗證 server 會發送 request 到我們用的網域
例如 www.foo.com/.well-known/acme-challenge/任意命名檔案 確認能否讀取檔案內容
能讀取到就驗證通過了,之後會自動把 .well-known 整個目錄跟內容砍掉

怎麼讓 server 允許 request 存取指定目錄裡的檔案
就看各家 server 用的 web container 設定了
certbot 有為 Apache 跟 Nginx 建立的 plugin
如果 web container 用這兩個,則可以根據 certbot 文件使用而不需要跟這篇走
我的環境是自己寫 route 導流
所以也不用管其他網路文章裡寫的常見設定了

開始建立流程

sudo ./certbot-auto certonly --webroot -w {your web root} -d {your domain}

webroot 就填寫前述你允許他建立檔案並存取的目錄了,通常用根目錄

完成後可以下 ./certbot-auto certificates 看目前的 certificate 細節
如果之後要 delete 已經建立的證書,有 ./certbot-auto delete  command 可以用

留意下若有需求給其他的 bash command 使用
可以依照自己的安全性考量選擇是否使用下面的 command

sudo chmod -R a+rx /etc/letsencrypt/live               # enable that bash script can access the cert
sudo chmod -R a+rx /etc/letsencrypt/archive         # enable that bash script can access the cert


我處理的環境並不直接吃 .pem 格式
所以還得再轉成 pkcs12 格式檔案
這段並不是每個 web server 都這樣,有些人就不需要這個段落了
建立 convertkeystore.sh
內容填入

#!/bin/bash

SERVER_HOME={server directory}
CERT_HOME=/etc/letsencrypt/live/{your domain}

# prop 會到指定的 .properties 檔案找值,視實際需求對應
function prop {
    grep "${1}" "$SERVER_HOME"/conf/ragic.properties|cut -d'=' -f2
}

set -e
set -x

(
  # pem certificate 路徑可以從 ./certbot-auto certificates 看到
  openssl pkcs12 -export -in "$CERT_HOME"/fullchain.pem -inkey "$CERT_HOME"/privkey.pem -out "$SERVER_HOME"/keystore -password pass:"$(prop 'SSL_PASSWORD')"
  chmod a+r "$SERVER_HOME"/keystore
)


執行 sudo bash ./convertkeystore.sh 轉出 pkcs 格式證書給我用的 web container 用
至於 server 怎麼把憑證吃進去就又是各家 server 用的 web container 的事了

接著講設定自動執行更新
因為我的需求是每次自動更新完後都還要再把 ,pem 轉 pkcs12
所以再寫一隻 renewcerts.sh 要求每次更新後都要再跑 convertkeystore.sh

#!/bin/sh
set -e
set -x

cd  /{your directory}/bin

./certbot-auto renew --post-hook "/{your directory}/bin/convertkeystore.sh"



接著設定 Linux 例行性排程

sudo crontab -e

# 這條是每週日跑 renewcerts.sh 做更新檢查,可以根據實際需求調整
0 12 * * 0 bash {server directory}/bin/renewcerts.sh >/dev/null 2>&1 &   

renewcerts.sh 裡用的 renew 指令是到期前 15 天才會允許更新
如果之後日期調整都是以 Certbot-auto 文件為準

我用的 web container 能 hot reload certificates 所以到此結束了
若有重啟 server 套用 certificate 的需求,也是像這樣設定在 crontab


部分內容參考自文章 LetsEncrypt certs with embedded Jetty on

留言