acme.sh 免費申請TSL/SSL域名證書

acme.sh 免费申请 SSL/TSL 域名证书

使用acme.sh 腳本,在Linux伺服器上免費申請TSL /SSL 網域憑證

免費申請,自動續簽配置acme.sh 腳本,下方非常好用的腳本,安裝簡單,支持方式申請及HTTP方式申請,Let's Encrypt申請十分簡單、自動化且免費。 acme.sh 實作了acme 協定, 可以從let's encrypt 產生免費的憑證。

let's encrypt 和acme.sh 的簡介

什麼是let's encrypt

Let's Encrypt是一個於2015年第三季推出的數位憑證認證機構,旨在以自動化流程消除手動建立和安裝憑證的複雜流程,並推廣使萬維網的加密連線無所不在,為安全網站提供免費的SSL/證書。
Let's Encrypt由網路安全研究小組(縮寫ISRG)提供服務。主要贊助商包括電子前哨基金會、Mozilla基金會、Akamai以及思科。 2015年4月9日,ISRG與Linux基金會宣布合作。
以實現新的數位證書認證機構的協定稱為自動證書管理環境(ACME)。上有這一規範的草案,且提案的一個版本已作為一個草案發布。
Let's Encrypt申請網域證書這一過程十分簡單、自動化且免費。

acme.sh 免费申请 SSL/TSL 域名证书

什麼是acme.sh

簡單來說 acme.sh 實作了acme 協議, 可以從let's encrypt 產生免費的證書。
acme.sh 有以下特點:

  • 一個純粹用Shell(Unix shell)語言寫的ACME協定客戶端。
  • 完整的ACME 協定實作。
  • 支援ECDSA 證書
  • 支援SAN 和通配符證書
  • 簡單,強大且非常易於使用。你只需要3分鐘來學習它。
  • Bash,dash和sh相容。
  • 純粹用Shell 寫,不依賴
  • 只需一個腳本即可自動頒發、續訂和安裝證書。
  • 不需要存取權限。 root/sudoer
  • 碼頭工人就緒
  • IPv6 就緒
  • 用於續訂或錯誤等的 作業通知。

Github專案首頁:https://github.com/acmesh-official/acme.sh

如何安裝acme.sh

實作ACME 用戶端協定的純Unix shell 腳本。

安裝acme.sh 腳本

安裝很簡單, 一個指令:

my@example.com替換成你的Email電子郵件信箱。

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

將腳本下載到伺服器安裝:

wget -O - https://get.acme.sh | sh -s email=my@example.com

或者,從git 安裝,複製此專案並啟動安裝:

git clone https://github.com/acmesh-official/acme.sh.git cd ./acme.sh ./acme.sh --install -m my@example.com

安裝程式將執行3 個操作:

  • 建立並複製到您的主頁目錄():。所有證書也將放在此資料夾中。 acme.sh$HOME~/.acme.sh/
  • 為以下內容建立別名:acme.sh=~/.acme.sh/acme.sh
  • 建立每日cron 作業以根據需要檢查和續訂證書。

配置acme.sh 腳本

普通用戶和root 用戶都可以進行acme.sh 安裝使用。
安裝過程進行了以下幾個步驟:
把acme.sh 安裝到你的home 目錄下:~/.acme.sh/並創建一個bash 的alias, 方便你的使用:

alias acme.sh=~/.acme.sh/acme.sh echo 'alias acme.sh=~/.acme.sh/acme.sh' >>/etc/profile

安裝過程中會自動為你建立cronjob, 每天0:00 點自動偵測所有的憑證, 如果快過期了, 需要更新, 則會自動更新憑證。

00 00 * * * root /root/.acme.sh/acme.sh --cron --home /root/.acme.sh &>/var/log/acme.sh.logs

更進階的安裝選項請參考: https://github.com/Neilpang/acme.sh/wiki/How-to-install
在該腳本的安裝過程不會污染已有的系統任何功能和文件, 所有的修改都限制在安裝目錄中: ~/.acme.sh/

使用acme.sh 申請證書

acme.sh 實作了acme 協定支援的所有驗證協定. 一般有兩種方式驗證: http 和dns 驗證。

HTTP 方式

http 方式需要在你的網站根目錄下放置一個檔案, 來驗證你的網域所有權,完成驗證. 然後就可以產生憑證了。

下面以網域uzbox.com為例:

acme.sh --issue -d uzbox.com -d *.uzbox.com --webroot /www/wwwroot/uzbox.com/

只需要指定域名,並指定域名所在的網站根目錄. acme.sh 會全自動的生成驗證文件,並放到網站的根目錄,然後自動完成驗證。最後會聰明的刪除驗證文件,整個過程沒有任何副作用。
如果你用的 伺服器,acme.sh 還可以智慧的從apache的設定自動完成驗證,你不需要指定網站根目錄:

acme.sh --issue -d uzbox.com --uzbox.com

如果你用的 伺服器,或者反代, acme.sh 還可以智慧的從nginx的設定自動完成驗證,你不需要指定網站根目錄:

acme.sh --issue -d uzbox.com --nginx

注意:無論是apache 還是nginx 模式, acme.sh在完成驗證之後,會恢復到先前的狀態,都不會私自更改你本身的設定。好處是你不用擔心配置被搞壞。
這類型的配置有一個缺點,你需要自己配置ssl 的配置,否則只能成功產生證書,你的網站還是無法存取https,但是為了安全,你還是自己手動改配置吧。
如果你還沒有運行任何web 服務,80 端口是空閒的,那麼 acme.sh 還能假裝自己是一個webserver,臨時聽在80 端口,完成驗證:

acme.sh --issue -d uzbox.com --standalone

更進階的用法請參考: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert

DNS方式

這種方式的好處是,你不需要任何伺服器,不需要任何公網ip,只需要dns 的解析記錄即可完成驗證。
這種方式的缺點是,如果不同時配置Automatic DNS API,使用這種方式acme.sh 將無法自動更新證書,每次都需要手動再次重新解析驗證網域所有權。

DNS方式申請證書

cd /root/.acme.sh acme.sh --issue -d *.uzbox.com -d uzbox.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

修改DNS,在NS管理方修改主機記錄。

DNS方式產生證書

取得Let's Encrypt免費泛域名憑證。等待DNS解析生效後,執行以下指令重新產生憑證:

acme.sh --renew -d *.uzbox.com -d uzbox.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

注意第二次這裡用的是 –renew

dns 方式API

dns 方式的真正強大之處在於可以使用商提供的api 自動添加 記錄完成驗證。
acme.sh 目前支持 、dnspod、cloudxns、 以及ovh 等數十種解析商的自動整合。
以dnspod 為例, 你需要先登入dnspod 帳號,產生你的api id 和api key ,都是免費的。

export DP_Id="xxxxxxxxxxx" export DP_Key="xxxxxxxxxxxxxx" acme.sh --issue --dns dns_dp -d uzbox.com -d www.uzbox.com

證書就會了. 這裡給的api id 和api key 會被自動記錄下來, 將來你在使用dnspod api 的時候, 就不需要再次指定了. 直接生成就好了:

acme.sh --issue -d uzbox.com --dns dns_dp

更詳細的api 使用: https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md

TLS/SSL 憑證的使用

TLS/SSL憑證安裝

前面證書產生以後, 接下來需要把證書copy 到真正需要用它的地方。

注意, 預設產生的憑證都放在安裝目錄下: ~/.acme.sh/, 請不要直接使用此目錄下的檔案,
例如: 不要直接讓nginx/apache 的設定檔使用這下面的檔.
這裡面的文件都是內部使用, 而且目錄結構可能會變化.正確的使用方法是使用–installcert 命令,並指定目標位置, 然後證書文件會被copy到相應的位置, 例如:

acme.sh --installcert -d uzbox.com \ --key-file /etc/nginx/ssl/uzbox.key \ --fullchain-file /etc/nginx/ssl/fullchain.cer \ --reloadcmd "systemctl force -reload nginx"

Nginx伺服器安裝SSL憑證

例如:以Nginx標準設定為例,產生的憑證檔案建議使用fullchain.cer,私鑰檔案為是uzbox.com.key。

Nginx 的設定ssl_certificate 使用fullchain.cer ,而非 .cer ,否則SSL Labs 的檢定會回報Chain issues Incomplete 錯誤。
透過上述中產生的憑證路徑為/www/server/panel/vhost/cert/uzbox.com/;
修改Nginx的設定檔

server { listen 443; server_name uzbox.com; ssl on; root html; index index.html index.htm; ssl_certificate /www/server/panel/vhost/cert/uzbox.com/fullchain.cer; ssl_certificate_key ///uzbox/fullchain.cer; ssl_certificate_key/www/www/www/www/www/www panel/vhost/cert/uzbox.com/clsn.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4444:! ; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }

重啟nginx,載入新配置

systemctl force-reload nginx

注意:這裡用的是systemctl force-reload nginx,不是systemctl reload nginx,reload 不會重新載入證書,所以使用的force-reload。

更新證書

證書的更新

目前證書有效期是90天,在60 天後會通過自動更新,你無需任何操作。都是自動的,你不用擔心證書失效的問題。

acme.sh 更新

目前由於acme 協定和letsencrypt CA 都在頻繁的更新, 因此acme.sh 也經常更新以保持同步.
升級acme.sh 到最新版:

acme.sh --upgrade
如果你不想手動升級, 可以開啟自動升級:
acme.sh --upgrade --auto-upgrade
之後, acme.sh 就會自動保持更新了. 你也可以隨時關閉自動更新:
acme.sh --upgrade --auto-upgrade 0
參考文獻
評分

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *