GCP Cloud DNS & letsencrypt 的 ssl 憑證申請與續期

Auto renew letsencrypt by certbot in GCP.

在本範例你會學到:

  • 手動更新 letsencrypt 的 ssl 憑證 (有使用Cloud DNS)
  • 自動更新 letsencrypt 的 ssl 憑證 (有使用Cloud DNS)
  • 將不安全網頁(http)變成綠色小鎖頭(https)
  • 使用 certbot
  • 使用 certbot-dns-google

在本範例你需要先準備好:

  • 有使用 Cloud DNS 將 GCP 的機器與其他第三方網域(ex:GoDaddy)供應商進行綁定
  • 對 GCP 有一定熟悉程度
  • 需要 https 將網頁變成安全的網頁的需求
  • 所有設定都在 CentOSpython3 環境完成

1.簡介

大家在開發網頁的時候基本上一開始一定都還是使用 http 的網址作為開頭使用,不過現在 Google 大神會將 http 開頭的網頁視為不安全的網頁,當然基本上不會特別直接影響到網頁的速度、效能以及其他功能,依然可以正常使用,不過長時間以來是會影響 seo 排名的喔!所以本教學就來告訴大家如何將 http 變成 https 的綠色小鎖頭吧!

憑證的綠色小鎖頭

要變成綠色小鎖頭就必須要有憑證,而憑證又該如何取得呢,有兩種方式:

  • 付錢
  • 免費的 letsencrypt (每三個月必須更新憑證)

本教程將會記錄如何將 免費letsencrypt 的憑證自動續約,這樣就可以免去手動更新的麻煩了!

看到這踏家或許有些疑問為什麼我一直要特別強調 DNS 呢?因為這個方法只適用於有使用 GCP Cloud DNS 才能使用喔。如果是正常的方式網路上已經超級多方法了(這也是我一直沒發現用錯方法的原因),我這邊就不特別在寫一篇了,不過基本上語法都是一樣的,到官網上看稍微修改也是可以使用的。

2.手動申請與續約

這邊還是稍微講述一下簡單的手動模式,給不需要自動更新或是單純測試的夥伴們可以先用這個方法測試喔!!

先安裝套件:

pip install certbot

直接進入主題下語法:

  • –dry-run: 代表不會真的執行,試跑與法有沒有錯誤可以使用
  • -d: 有多少個 domain 就寫幾個
  • –server: 照抄就好

要特別注意這邊是使用 dns喔!

certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns  -d test.com.tw -d www.test.com.tw --dry-run

接下來就是比較麻煩也可能會出錯的地方:

  • 按下 enter 後直接到 GCP Cloud DNS 頁面(不知道我在講什麼請看這篇)選擇目前要使用的區域(domain)
  • 按下新增紀錄集,並依照剛剛 enter 後 terminal 的指示新增資源記錄類型中的TXT,並將 terminal 中的序號填入TXT 資料並按下建立,並等待至少30秒,讓它生效(此步驟需要等待時間生效,直接繼續在 terminal 按 enter 可能會設定失敗)
  • 等待秒數過後可以繼續新增下一個 domain,一樣再到 GCP 頁面新增序號,直到沒有網域需要新增就結束

以上步驟如果有訊息說失敗,可以再試一次,有可能是等待時間不夠長,不過依據經驗30秒是足夠的。

設定完成就會見到以下訊息:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/test.com.tw/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/test.com.tw/privkey.pem
   Your cert will expire on 2020-06-29. 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

該訊息基本上包含兩件事:

  • 該憑證的到期日,三個月後就會作廢
  • 該憑證的產生位置(*.pem),可以依需求放到自己相對應的伺服器位置(Nginx or Apache)

若是需要手動續約,也非常簡單 (正式的時候要把--dry-run拿掉喔!):

sudo certbot renew --dry-run

3.自動更新

網路上有非常多手動/自動更新的方法,小弟在使用每一篇文章都會看到的 sudo certbot renew 從來都沒有成功過,一直都抱一樣的錯誤訊息,所以非常苦惱,不想要三個月就手動一次,後來才發現原來 Google 有相對應的套件可以使用啊!!

直接切入主題:

1.安裝

pip install certbot-dns-google

2.設定 Google Credentials,取得金鑰 json

每次都有的貼心小提醒:GCP頁面變動相當的大,可能短短幾個月步驟就不一樣了,請大家多注意!

  • 於 GCP 導覽列中找到 API 和服務選擇憑證
  • 按下建立憑證選擇服務帳戶 (找不到看下圖)

設定步驟

  • 輸入名稱
  • 進入將專案存取權授予這個服務帳戶要進行角色選擇,可以依照官網自己決定,或是可以跟著本篇設定即可,這裡可能要花點時間找到想要的角色:
dns.changes.create
dns.changes.get
dns.managedZones.list
dns.resourceRecordSets.create
dns.resourceRecordSets.delete
dns.resourceRecordSets.list
dns.resourceRecordSets.update
  • 最後一步驟有一個建立金鑰,按下去選擇 json 並下載
  • 得到金鑰後,將剛剛的金鑰 json 檔放到網頁伺服器的(vm)的相對應位置(自行決定),並輸入下列語法:
    • -d: 更改網域位置
    • --dns-google-credentials 位置為 json 檔路徑
certbot certonly --dns-google --dns-google-credentials /etc/letsencrypt/renewal/fabled-mystery-264984-6tg78hcd467.json -d www.test.com.tw. -d test.com.tw. --dry-run

基本上會跟上方手動很像,不過這個的好處就是不用自己輸入 TXT 金鑰囉!!執行指令後可以在 GCP Cloud DNS頁面看到它運作的情況,會自動幫你新增,沒收到任何錯誤訊息就是成功囉,如果有遇到錯誤可以先在執行一次看看,通常就會解決了。

3.將 ssl 憑證放入相對應位置

這個步驟跟上方的手動設定基本上功能一樣,完成後將剛剛產生的 fullchain.pemprivkey.pem放到伺服器相對位置下,以Nginx為例子,將下列設定加入設定檔 /etc/nginx/nginx.conf中:

ssl_certificate /etc/letsencrypt/live/test.com.tw/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.com.tw/privkey.pem;

4.更新憑證

基本上上面都沒問題,這步驟也會順利:

certbot renew --dry-run

4.確認憑證狀態

這步驟就是簡單地使用網頁去驗證剛剛產生的憑證是否狀態正常且生效:

  • 將下列的 www.test.com.tw 換成自己的網址即可使用
https://www.ssllabs.com/ssltest/analyze.html?d=www.test.com.tw&latest
  • 若沒問題就會看到以下畫面

成功畫面

在主機上也可測試剛剛申請的是否成功與狀態顯示:

sudo certbot certificates

5.自動更新憑證

最後的重點就是不想要三個月就執行以上的步驟一次,所以在主機上設定 cron job讓他自己去更新:

進入主機並輸入(不同OS方法有所差異,請斟酌參考)

crontab -e

輸入相對應的更新日期以及月份就大功告成囉,若不懂怎麼設定可以參考下方參考資料的連結!請記得正式的情況--dry-run要拿掉喔!

以上都完成後,就可以去看看有沒有變成綠色小鎖頭了(https)。

參考資料

特別感謝作者tn710617在憑證設定部分給予大大的幫助

https://tn710617.github.io/zh-tw/letsEncryptWildcard/#%E8%A8%AD%E5%AE%9A-Google-Credentials

排程設定教學

https://www.rusnake.com/2017/04/28/centos-7-nginx-%E5%AE%89%E8%A3%9D-letsencrypt-%E6%86%91%E8%AD%89/

https://andyyou.github.io/2019/04/13/how-to-use-certbot/

certbot-dns-google 詳細設定

https://certbot-dns-google.readthedocs.io/en/stable/

若有任何問題與指教歡迎與我聯繫,若覺得我的內容不錯麻煩幫我隨便點個廣告,謝謝。


 上一篇
pyspark系列-字串轉時間格式 string to datetime or timestamp pyspark系列-字串轉時間格式 string to datetime or timestamp
How to convert pyspark string to datetime?在本範例你會學到: to_date 使用方式 (New in version 2.2) unix_timestamp 使用方式 在本範例你需要先準備好:
2020-06-04
下一篇 
GCP系列-將 GoDaddy 網域與 Google DNS進行綁定 GCP系列-將 GoDaddy 網域與 Google DNS進行綁定
How to connect domain of GoDaddy with GCP Cloud DNS?在本範例你會學到: 使用 GCP 服務的 Cloud DNS GoDaddy domain 與 GCP Cloud DNS 的代管綁定
2020-05-23
  目錄