選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
5 分鐘閱讀時間 (992 個字)

使用 acme.sh 幫個人網站取得免費的 SSL 憑證

igor-miske-JVSgcV8_vb4-unsplash_


上次講了使用 Certbot 取 Let’s Encrypt SSL 憑證失敗的故事,文末有說這次就介紹改用 acme.sh 來取得免費的 SSL 憑證,不過我在設定的過程中發生了小小的事故,因為 acme.sh 預設取得的憑證為 ZeroSSL 簽發的憑證,我是安裝完新憑證才發現的,也懶得改了,如果讀者想拿到 Let’s Encrypt 的 SSL 憑證,本文中有一行指令務必要執行喔。本文同時發佈於個人部落格

安裝

首先要安裝 acme.sh ,安裝方法並不是我們常見的apt-install,而是取得官方腳本並執行,可以使用curlwgetgit clone的方式取腳本

這邊我依照官方文件,使用以下指令來安裝,第一次使用 acme.sh時需要時要輸入自己的email信箱,可以在這時順便設定

curl https://get.acme.sh | sh -s email=my@email.com

安裝完畢後,就可以輸入acme.sh -v指令來來看看是否有安裝成功

danny@dannyServer:~$ acme.sh -v
https://github.com/acmesh-official/acme.sh
v3.0.0

如果剛剛執行腳本時忘了順便設定信箱,可以使用以下指令來進行設定

acme.sh --register-account -m my@email.com

接下來就可以去申請憑證了

設定預設CA

現在acme.sh預設的憑證機構為 ZeroSSL ,可以用以下指令更換為Let's Encrypt

acme.sh --set-default-ca  --server  letsencrypt

申請憑證

我們要幫自己的網站申請憑證時,最重要的是向憑證機構證明自己是網站的擁有者,主要有兩個方式,HTTP驗證、DNS驗證。

HTTP 驗證

如果走 HTTP 驗證的方式的話,憑證機構會給我們一個驗證用的檔案並要求我們將該檔案放在該網站的根目錄上,然後驗證機構就會連到網站上看有沒有這個檔案內容有沒有一樣,有的話就能證明我們是該網站的擁有者。

假設驗證用的檔案叫apple.text,我的網站dannyliu.me,如果走 HTTP 驗證,當憑證機構連到dannyliu.me/apple.text,應能取得到該檔案,並且內容正確。驗證成功的話就可以拿到憑證了。

以上過程可以在acme.sh中可以用一行指令一鍵完成

acme.sh --issue -d 網站網址 -w 網站根目錄位置
acme.sh --issue -d dannyliu.me -w /home/danny/wordpress/

理論上執行完這一步就可以拿到憑證了,並且可以享受到acme.sh提供的自動更新憑證功能。可惜天不人願,我的站台走HTTP驗證都未通過,所以改走DNS驗證。

補充懶人模式: Apache 模式與 Nginx 模式

如果自己不曉得網站根目錄放在哪裡,只知道是用ApacheNginx架的網站,acme也提供以下指令幫你完成Http驗證(前提要你是root權限的網站管理員)

Apache:

acme.sh --issue --apache -d 網站網址

Nginx:

acme.sh --issue --nginx -d 網站網址

DNS 驗證

DNS驗證跟HTTP驗證的原理也是一樣的,只是要驗證的資料改放到DNS上面,但是後續取得憑證與更新憑證都要重新輸入指令。

輸入以下指令:

acme.sh --issue -d 網站網址 --dns
acme.sh --issue -d dannyliu.me --dns

應該會看到如下結果並且告訴你要怎麼設定DNS:

Using CA: https://acme.zerossl.com/v2/DV90
Single domain='dannyliu.me'
Getting domain auth token for each domain
Getting webroot for domain='dannyliu.me'
Add the following TXT record:
Domain: '_acme-challenge.dannyliu.me'
TXT value: 'OOOXXXXXOOOXXXXOOOOXXXXX'
Please be aware that you prepend _acme-challenge. before your domain
so the resulting subdomain will be: _acme-challenge.dannyliu.me
Please add the TXT records to the domains, and re-run with --renew.
Please add '--debug' or '--log' to check more details.
See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

之後前往自己網域的 DNS 設定頁面,新增一個 TXT 類型,名稱為_acme-challenge,內容值就複製貼上,按下儲存,就可以回到我們的主機上繼續輸入指令了
image 1628414971910

取得憑證

因為我的站台使用HTTP驗證的方式一直失敗,所以改使用DNS驗證,就會多這一個使用--renew參數的步驟,並且後來acme.sh還要求使用者額外輸入以下參數--yes-I-know-dns-manual-mode-enough-go-ahead-please,來確定你是否真的了解使用DNS模式要每三個月自己手動更新憑證

acme.sh --renew -d 網站網址 --yes-I-know-dns-manual-mode-enough-go-ahead-please

輸入完後應能完成DNS驗證,並且憑證已經下載至acme.sh資料夾中

Your cert is in  /root/.acme.sh/dannyliu.me/dannyliu.me.cer
Your cert key is in  /root/.acme.sh/dannyliu.me/dannyliu.me.key
The intermediate CA cert is in  /root/.acme.sh/dannyliu.me/ca.cer
And the full chain certs is there:  /root/.acme.sh/dannyliu.me/fullchain.cer

這邊有第二個指令,能幫你把憑證相關檔案複製並重新命名至自己指定的位置。可以剛好命名為你的網站伺服器憑證路徑,最後的--reloadcmd可以寫上叫網站伺服器指令,這邊我是讓我的apache2重新啟動,(注意這邊重啟是用force-reload這樣才會重新載入新憑證)

acme.sh --install-cert -d dannyliu.me \
--cert-file      /home/danny/ssl/dannyliu.me.cer  \
--key-file       /home/danny/ssl/dannyliu.me.key  \
--fullchain-file /home/danny/ssl/fullchain.cer \
--reloadcmd     "service apache2 force-reload"

執行完成後,重新開啟自己的網站,應該可以看到憑證已經更新了:)
image 1628429638712

補充

你可以在/etc/apache2/sites-available/中找的你的網站設定檔,檔案中就可以看到自己憑證放置的位置

<VirtualHost *:443>
...
    SSLEngine on
    SSLCertificateFile "/home/danny/ssl/dannyliu.me.cer"
    SSLCertificateKeyFile "/home/danny/ssl/dannyliu.me.key"
    SSLCertificateChainFile  "/home/danny/ssl/fullchain.cer"
</VirtualHost>

相關資料:

GitHub上的acme.sh/readme

頁首圖片Photo by Igor Miske on Unsplash

 

AspNetBoilerplate(ABP) - Background Job 介紹
[.Net Core] WebSocket
 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/04/26, 週五

Captcha 圖像