10

如何使用 Certbot 建立免費的 TLS/SSL 網域憑證並自動產生 PFX 憑證

 3 years ago
source link: https://blog.miniasp.com/post/2021/05/09/Create-SSL-TLS-certificates-from-LetsEncrypt-using-Certbot-2
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

我之前有寫過一篇 如何使用 Certbot 命令列工具建立免費的 TLS/SSL 頂層網域憑證 文章,當時的情境是我的域名是 頂層網域 (naked domains)(Top-Level Domain)(TLD),必須用「手動」方式申請。今天這篇文章,我要示範如何「全自動」申請與更新憑證,並自動產生 Kestrel 所需的 *.pfx (PKCS#12) 憑證。

首次建立憑證與設定自動更新排程 (www.your-domain.com.tw)

本篇文章將會以 Ubuntu 18.04.1 LTS 為主進行示範,但其實使用的方式大同小異。

  1. 使用 SSH 登入 Ubuntu 18.04.1 LTS 主機

  2. 先確認 snapd 已升級到最新版本

    sudo snap install core; sudo snap refresh core
    
  3. 確認現有已安裝的 Certbot 已確實移除

    sudo apt-get remove certbot
    

    因為安裝 Certbot 的過程中會自動註冊一些排程工作,所以為了避免舊版本的 Certbot 影響到新的安裝,建議先移除舊版。

  4. 使用 snap 安裝 certbot 套件

    sudo snap install --classic certbot
    

    安裝過程中會自動安裝一個 snap.certbot.renew.service 系統服務,此服務專門用來自動更新憑證之用。你可以透過 systemctl list-units --all --type=service --no-pager | grep certbot 查詢該服務,或透過 service snap.certbot.renew status 查詢目前的執行狀態。剛安裝好的 certbot 並不會有服務執行。

  5. 到網站建立 /.well-known/acme-challenge/ 資料夾並測試網址可以正常連接

    cd $WWWROOT/
    
    mkdir -p .well-known/acme-challenge
    echo OK > .well-known/acme-challenge/abc
    curl https://www.your-domain.com.tw/.well-known/acme-challenge/abc
    rm -f .well-known/acme-challenge/abc
    

    這裡請將 $WWWROOT 替換成你目前的網站根目錄。

  6. sudo certbot certonly --webroot
    

    注意:所有偵錯訊息都會放在 /var/log/letsencrypt/letsencrypt.log 檔案中。

    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Plugins selected: Authenticator webroot, Installer None
    Enter email address (used for urgent renewal and security notices)
    (Enter 'c' to cancel): [email protected]
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Please read the Terms of Service at
    https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
    agree in order to register with the ACME server. Do you agree?
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (Y)es/(N)o: Y
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Would you be willing, once your first certificate is successfully issued, to
    share your email address with the Electronic Frontier Foundation, a founding
    partner of the Let's Encrypt project and the non-profit organization that
    develops Certbot? We'd like to send you email about our work encrypting the web,
    EFF news, campaigns, and ways to support digital freedom.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (Y)es/(N)o: N
    Account registered.
    Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
    to cancel): www.your-domain.com.tw
    Requesting a certificate for www.your-domain.com.tw
    Performing the following challenges:
    http-01 challenge for www.your-domain.com.tw
    Input the webroot for www.your-domain.com.tw: (Enter 'c' to cancel): $WWWROOT/
    Waiting for verification...
    Cleaning up challenges
    
    IMPORTANT NOTES:
    - Congratulations! Your certificate and chain have been saved at:
      /etc/letsencrypt/live/www.your-domain.com.tw/fullchain.pem
      Your key file has been saved at:
      /etc/letsencrypt/live/www.your-domain.com.tw/privkey.pem
      Your certificate will expire on 2021-07-20. To obtain a new or
      tweaked version of this certificate in the future, simply run
      certbot again. To non-interactively renew *all* of your
      certificates, run "certbot renew"
    - If you like Certbot, please consider supporting our work by:
    
      Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
      Donating to EFF:                    https://eff.org/donate-le
    
  7. 確認憑證輸出結果

    憑證輸出路徑

    /etc/letsencrypt/live/www.your-domain.com.tw/
    

    主要 Certbot 設定檔

    /etc/letsencrypt/renewal/www.your-domain.com.tw.conf
    
  8. 憑證輸出路徑下的憑證檔案

    伺服器憑證 fullchain.pem (此檔案將包括完整的憑證鏈)

    私密金鑰檔 privkey.pem (此檔案是未加密的金鑰檔)

  9. 修改 Apache 的 SSL 相關設定

    檔案路徑: /etc/apache2/sites-enabled/www.your-domain.com.tw.conf

    SSLCertificateFile      /etc/ssl/certs/www.your-domain.com.tw.crt
    SSLCertificateKeyFile   /etc/ssl/private/www.your-domain.com.tw.key
    SSLCertificateChainFile /etc/ssl/certs/twca-chain.crt
    
    SSLCertificateFile      /etc/letsencrypt/live/www.your-domain.com.tw/cert.pem
    SSLCertificateKeyFile   /etc/letsencrypt/live/www.your-domain.com.tw/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/www.your-domain.com.tw/chain.pem
    
  10. 重新啟動 Apache 服務

    sudo service apache2 reload
    
  11. 驗證憑證自動更新 (Renew)

    sudo certbot renew --webroot --dry-run
    

    上述命令會自動設定一個系統排程,你可以透過 systemctl list-timers --no-pagersystemctl list-unit-files --type timer 查詢到一個名為 snap.certbot.renew.timer 的排程作業(UNIT)。

  12. 調整 Systemd 的 Timer 排程

    請將 [Timer] 區段修改為 每天早上 4:30 執行一次

    vi /etc/systemd/system/timers.target.wants/snap.certbot.renew.timer
    
    [Timer]
    Unit=snap.certbot.renew.service
    OnCalendar=*-*-* 04:30
    

    關於定時的格式可以參考 systemd/Timers - ArchWiki 文件說明。

取得憑證後自動產生 PFX 憑證

  1. 產生 PFX (PKCS#12) 憑證檔

    cd /etc/letsencrypt/live/www.your-domain.com.tw/
    
    PASSWORD=SD9QT4bVq
    openssl pkcs12 -export -out your-domain.pfx -inkey "privkey.pem" -in "cert.pem" -certfile "fullchain.pem" -password "pass:$PASSWORD"
    
    cp your-domain.pfx $YourPfxLocation/your-domain.pfx
    

    注意: 請將 $YourPfxLocation 替換為你的 PFX 放置路徑!

  2. 重新啟動網站

    service MyService reload
    

    注意: 我有將我的 Kestrel 網站伺服器封裝成一個服務,假設服務名稱為 MyService

    如果網站可以正常瀏覽,才能確認你所產生的 PFX 檔案正確無誤,這時才能進行下一步。

  3. 建立一個 /etc/letsencrypt/renewal-hooks/post/certbot-post-hook.sh 檔案

    這個檔案會在每次成功 Renew 憑證後自動執行,如此一來你就可以將自動產生 PFX 與重新啟動網站伺服器的動作,寫在這個 Shell Script 裡面,這樣就能完成自動化了!

    #!/bin/sh
    
    cd /etc/letsencrypt/live/www.your-domain.com.tw/
    
    PASSWORD=SD9QT4bVq
    openssl pkcs12 -export -out your-domain.pfx -inkey "privkey.pem" -in "cert.pem" -certfile "fullchain.pem" -password "pass:$PASSWORD"
    
    cp your-domain.pfx $YourPfxLocation/your-domain.pfx
    
    service MyService status
    

    變更執行權限

    chmod 700 /etc/letsencrypt/renewal-hooks/post/certbot-post-hook.sh
    
  4. 驗證憑證自動更新 (Renew)

    sudo certbot renew --webroot --dry-run
    

    請記得加上 --dry-run 測試目前的腳本與設定可以正確的更新憑證並自動建立 PFX 憑證與重新啟動網站伺服器。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK