acme.sh 實現了 acme 協議, 可以從 letsencrypt 生成免費的證書.
主要步驟:
- 安裝 acme.sh
- 生成證書
- copy 證書到 nginx/apache 或者其他服務
- 更新證書
- 更新 acme.sh
- 出錯怎麼辦, 如何調試
下面詳細介紹.
1. 安裝 acme.sh
安裝很簡單, 一個命令:
<code>curl
https://get.acme.sh | sh /<code>
普通用戶和 root 用戶都可以安裝使用. 安裝過程進行了以下幾步:
- 把 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
-upgrade0
/<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