Linux下使用acme.sh申請和管理Let’s Encrypt證書


關於Let’s Encrypt 免費SSL證書

Let’s Encrypt 作為一個公共且免費 SSL 的項目逐漸被廣大用戶傳播和使用,是由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等組織人員發起,主要的目的也是為了推進網站從 HTTP 向 HTTPS 過度的進程,目前已經有越來越多的商家加入和贊助支持。

Let’s Encrypt 免費 SSL 證書的出現,也會對傳統提供付費 SSL 證書服務的商家有不小的打擊。到目前為止,Let’s Encrypt 獲得 IdenTrust 交叉簽名,這就是說可以應用且支持包括 FireFox、Chrome 在內的主流瀏覽器的兼容和支持,雖然目前是公測階段,但是也有不少的用戶在自有網站項目中正式使用起來。

Let’s Encrypt 的最大貢獻是它的 ACME 協議,第一份全自動服務器身份驗證協議,以及配套的基礎設施和客戶端。這是為了解決一直以來 HTTPS TLS X.509 PKI 信任模型,即證書權威(Certificate Authority, CA)模型缺陷的一個起步。

在客戶端-服務器數據傳輸中,公私鑰加密使得公鑰可以明文傳輸而依然保密數據,但公鑰本身是否屬於服務器,或公鑰與服務器是否同屬一個身份,是無法簡單驗證的。證書權威模型通過引入事先信任的第三方,由第三方去驗證這一點,並通過在服務器公鑰上簽名的方式來認證服務器。第三方的公鑰則在事先就約定並離線准備好,以備訪問時驗證簽名之用。這個第三方就稱為證書權威,簡稱 CA。相應的,CA 驗證過的公鑰被稱為證書。

問題是,如果服務器私鑰泄露,CA 無法離線使對應的證書無效化,只能另外發布無效記錄供客戶端查詢。也就是說,在私鑰泄露到 CA 發布無效記錄的窗口內,中間人可以肆意監控服-客之間的傳輸。如果中間人設法屏蔽了客戶端對無效記錄的訪問,那么直到證書過期,中間人都可以進行監控。而由於當前 CA 驗證和簽發證書大多手動,證書有效期往往在一年到三年。

Let’s Encrypt 簽發的證書有效期只有90天,甚至希望縮短到60天。有效期越短,泄密后可供監控的窗口就越短。為了支撐這么短的有效期,就必須自動化驗證和簽發。因為自動化了,長遠而言,維護反而比手動申請再安裝要簡單。

證書的有效期,我堅持認為這是合理的。Let’s Encrypt 的證書是自動簽發的,對 Let’s Encrypt 的目標用戶(個人網站、小網站)來說,90天已經是一個很長的時間了。特別是個人網站,域名所有權的變動是非常快的。可能前幾天域名還屬於張三,后幾天就屬於李四了。因此自動簽發一個長有效期的證書是很容易產生問題的。如果證書的有效期是兩年,那么經常交易域名的人就可以長時間持有已經不屬於他們的域名的證書。並且這種持有不受證書吊銷列表的控制,因為簽發的時候,所有權是沒有問題的,即使后來所有權變更了,Let’s Encrypt 也不會知道。所以設的有效期短一點,可以減少這個問題的影響。然后是易用性,現在已經有不少的 Let’s Encrypt 自動續期腳本了,配好后就不用管了,非常方便。

總之,強烈推薦站長和服務器平台用 Let’s Encrypt 向訪客提供加密連接。這是域名認證未來的發展方向。

怎么樣,看了上述有關 Let’s Encrypt 的介紹后,是否還鄙視這種“免費”SSL 證書呢?

下面我們就具體的講述一下利用 Let’s Encrypt 的 ACME 協議在服務器上運用 acme.sh 腳本來申請、管理 SSL 證書(這里要強調一下的是 Let’s Encrypt 的 SSL 證書申請是必須要有服務器 root 權限的哦,也就是說必須是 VPS(雲主機)才可以的,虛擬主機上是無法申請獲取的,但是可以在 VPS(雲主機)上申請后部署到虛擬主機上)。

首先我們要先下載 acme.sh 到我們的主機上來,安裝命令非常的簡單,如下:

 

注:必須在 root 權限下運行上述命令哦,切記!切記!切記!如果域名都在阿里雲,推薦使用 DNS 方式來驗證

把 acme.sh 安裝到你的 root 目錄下:~/.acme.sh/並創建 一個 bash 的 alias, 方便你的使用:

 

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

安裝結束后會自動添加一條定時任務(官方解釋:自動為你創建 cronjob, 每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書。),使用crontab -l 查看。

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

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

 

 

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

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

 

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

 

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

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

 

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

這種方式的好處是, 你不需要任何服務器, 不需要任何公網 ip, 只需要 dns 的解析記錄即可完成驗證.

 

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

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

 

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

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

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

以 阿里雲 為例, 你需要先登錄到阿里雲 賬號, 然后控制台,右上角你的頭像里,有Access Key 然后:

 

 

多個域名就增加 -d www.bb.com

經過等待120秒后,證書就會自動生成,提示:

提示這個說明證書就生成成功了

這里給出的Ali_Key 和Ali_Secret 會被自動記錄下來, 將來你在使用 aliyun api 的時候, 就不需要再次指定了. 直接生成就好了:

 

3、 copy/安裝 證書

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

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

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

 

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

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

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

4、更新證書

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

5、更新 acme.sh

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

升級 acme.sh 到最新版 :

 

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

 

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

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

 

好了,到此acme.sh的使用基本就是這些了,至於是采用HTTP還是DNS方式來申請證書?就經驗來看,我比較喜歡DNS的驗證方式,因為這種方式的依賴性最小,更加的靈活,我建議大家都用DNS來驗證申請Let’s Encrypt證書。

當然,acme.sh還有不少實用的參數可以方便我們來管理已經通過acme.sh申請過證書、域名等等,比如:

 

這個就是列出當前已經申請到證書的域名信息,如下圖:

具體的參數,大家可以使用 acme.sh --help 來查看。

6、NGINX安裝證書

 

在站點配置文件里加入以上代碼即可,證書路徑是第三步 copy 寫的路徑,記得別搞錯

其實 acme.sh 的使用還是非常“傻瓜”的,只要照着指令參數做就可以輕松搞定的,上述的示例其實將域名修改為自己的域名就可以用了,其它的也是同樣的道理,簡單修改一下參數就可以拿來用的。目前,申請獲取 Let’s Encrypt 證書有很多種方法,軍哥的 LNMP 一鍵包里也可以直接申請的,網上也有不少申請 Let’s Encrypt 證書的教程,使用的工具可以說是五花八門。但是,就經驗來看 acme.sh 這個是最方便、最快捷、最省事兒的,因為使用的就是 Let’s Encrypt 的 ACME 協議,所以兼容性絕對是最可靠的,Shell 腳本式的對系統幾乎沒有任何依懶性,有很強的自由度。

好了,申請獲取 Let’s Encrypt 證書的教程就講到這里了,后期如果積累新的經驗我會第一時間分析給大家的,大家有什么疑問也可以在下面的評論里提出來。

轉載於:https://www.zhoutao.org/blog/2018/05/773.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM