acme.sh 配合 letsencrypt 配置泛域名

acme.sh 實現了 acme 協議, 可以從 letsencrypt 生成免費的證書.

主要步驟:

  1. 安裝 acme.sh
  2. 生成證書
  3. copy 證書到 nginx/apache 或者其他服務
  4. 更新證書
  5. 更新 acme.sh
  6. 出錯怎麼辦, 如何調試

下面詳細介紹.

1. 安裝 acme.sh

安裝很簡單, 一個命令:

<code>

curl

https://get.acme.sh | sh /<code>

普通用戶和 root 用戶都可以安裝使用. 安裝過程進行了以下幾步:

  1. 把 acme.sh 安裝到你的 home 目錄下:
<code>~ 

/.acme.sh/

/<code>

並創建 一個 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh

2). 自動為你創建 cronjob, 每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書.

更高級的安裝選項請參考: https://github.com/Neilpang/acme.sh/wiki/How-to-install

安裝過程不會汙染已有的系統任何功能和文件, 所有的修改都限制在安裝目錄中: ~/.acme.sh/

2. 生成證書

acme.sh 實現了 acme 協議支持的所有驗證協議. 一般有兩種方式驗證: http 和 dns 驗證.

1. http 方式需要在你的網站根目錄下放置一個文件, 來驗證你的域名所有權,完成驗證. 然後就可以生成證書了.

<code>acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  

/home/wwwroot/mydomain.com/

/<code>

只需要指定域名, 並指定域名所在的網站根目錄. acme.sh 會全自動的生成驗證文件, 並放到網站的根目錄, 然後自動完成驗證. 最後會聰明的刪除驗證文件. 整個過程沒有任何副作用.

如果你用的 apache服務器, acme.sh 還可以智能的從 apache的配置中自動完成驗證, 你不需要指定網站根目錄:

<code>

acme

.sh

--issue

-d

mydomain

.com

--apache

/<code>

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

<code>

acme

.sh

--issue

-d

mydomain

.com

--nginx

/<code>

注意, 無論是 apache 還是 nginx 模式, acme.sh在完成驗證之後, 會恢復到之前的狀態, 都不會私自更改你本身的配置. 好處是你不用擔心配置被搞壞, 也有一個缺點, 你需要自己配置 ssl 的配置, 否則只能成功生成證書, 你的網站還是無法訪問https. 但是為了安全, 你還是自己手動改配置吧.

如果你還沒有運行任何 web 服務, 80 端口是空閒的, 那麼 acme.sh 還能假裝自己是一個webserver, 臨時聽在80 端口, 完成驗證:

<code>

acme

.sh

--issue

-d

mydomain

.com

--standalone

/<code>

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

2. 手動 dns 方式, 手動在域名上添加一條 txt 解析記錄, 驗證域名所有權.

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

<code>

acme

.sh

--issue

--dns

-d

mydomain

.com

/<code>

然後, acme.sh 會生成相應的解析記錄顯示出來, 你只需要在你的域名管理面板中添加這條 txt 記錄即可.

等待解析完成之後, 重新生成證書:

<code>

acme

.sh

--renew

-d

mydomain

.com

/<code>

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

dns 方式的真正強大之處在於可以使用域名解析商提供的 api 自動添加 txt 記錄完成驗證.

acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等數十種解析商的自動集成.

以 dnspod 為例, 你需要先登錄到 dnspod 賬號, 生成你的 api id 和 api key, 都是免費的. 然後:

<code>

export

DP_Id=

"1234"

export

DP_Key=

"sADDsdasdgdsf"

acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com /<code>

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

<code>

acme

.sh

--issue

-d

mydomain2

.com

--dns

dns_dp

/<code>

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

3. copy/安裝 證書

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

注意, 默認生成的證書都放在安裝目錄下: ~/.acme.sh/, 請不要直接使用此目錄下的文件, 例如: 不要直接讓 nginx/apache 的配置文件使用這下面的文件. 這裡面的文件都是內部使用, 而且目錄結構可能會變化.

正確的使用方法是使用 --install-cert 命令,並指定目標位置, 然後證書文件會被copy到相應的位置, 例如:

Apache example:

<code>acme.sh  
 
 
 
 
/<code>

Nginx example:

<code>acme.sh  
 
 
 
/<code>

(一個小提醒, 這裡用的是 service nginx force-reload, 不是 service nginx reload, 據測試, reload 並不會重新加載證書, 所以用的 force-reload)

Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/.cer ,否則 SSL Labs 的測試會報 Chain issues Incomplete 錯誤。

--install-cert命令可以攜帶很多參數, 來指定目標文件. 並且可以指定 reloadcmd, 當證書更新以後, reloadcmd會被自動調用,讓服務器生效.

詳細參數請參考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc

值得注意的是, 這裡指定的所有參數都會被自動記錄下來, 並在將來證書自動更新以後, 被再次自動調用.

4. 更新證書

目前證書在 60 天以後會自動更新, 你無需任何操作. 今後有可能會縮短這個時間, 不過都是自動的, 你不用關心.

5. 更新 acme.sh

目前由於 acme 協議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經常更新以保持同步.

升級 acme.sh 到最新版 :

<code>

acme

.sh

--upgrade

/<code>

如果你不想手動升級, 可以開啟自動升級:

<code>acme.sh  --upgrade  --

auto

-upgrade /<code>

之後, acme.sh 就會自動保持更新了.

你也可以隨時關閉自動更新:

<code>acme.sh --upgrade  --

auto

-upgrade

0

/<code>

6. 出錯怎麼辦:

如果出錯, 請添加 debug log:

<code>

acme

.sh

--issue

.....

--debug

/<code>

或者:

<code>

acme

.sh

--issue

.....

--debug

2 /<code>

請參考: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh


分享到:


相關文章: