關於Let’s Encrypt 免費SSL證書 Let’s Encrypt 作為一個公共且免費 SSL 的項目逐漸被廣大用戶傳播和使用,是由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等組織人員發起,主要的目的也是為了推進網站從 HTTP 向 HTTPS 過度的進程,目前 ...
怎麼樣,看了上述有關 Let’s Encrypt 的介紹後,是否還鄙視這種“免費”SSL 證書呢?
下麵我們就具體的講述一下利用 Let’s Encrypt 的 ACME 協議在伺服器上運用 acme.sh 腳本來申請、管理 SSL 證書(這裡要強調一下的是 Let’s Encrypt 的 SSL 證書申請是必須要有伺服器 root 許可權的哦,也就是說必須是 VPS(雲主機)才可以的,虛擬主機上是無法申請獲取的,但是可以在 VPS(雲主機)上申請後部署到虛擬主機上)。
首先我們要先下載 acme.sh 到我們的主機上來,安裝命令非常的簡單,如下:
1 | curl https://get.acme.sh | sh |
註:必須在 root 許可權下運行上述命令哦,切記!切記!切記!如果功能變數名稱都在阿裡雲,推薦使用 DNS 方式來驗證
把 acme.sh 安裝到你的 root 目錄下:~/.acme.sh/
並創建 一個 bash 的 alias, 方便你的使用:
1 | acme.sh=~/.acme.sh/acme.sh |
安裝過程不會污染已有的系統任何功能和文件, 所有的修改都限制在安裝目錄中:
1 | ~/.acme.sh/ |
安裝結束後會自動添加一條定時任務(官方解釋:自動為你創建 cronjob, 每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書。),使用crontab -l 查看。
acme.sh 實現了 acme 協議支持的所有驗證協議. 一般有兩種方式驗證: http 和 dns 驗證.
1、http 方式需要在你的網站根目錄下放置一個文件, 來驗證你的功能變數名稱所有權,完成驗證. 然後就可以生成證書了.
1 | acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/ |
只需要指定功能變數名稱, 並指定功能變數名稱所在的網站根目錄. acme.sh 會全自動的生成驗證文件, 並放到網站的根目錄, 然後自動完成驗證. 最後會聰明的刪除驗證文件. 整個過程沒有任何副作用.
如果你用的 apache伺服器, acme.sh 還可以智能的從 apache的配置中自動完成驗證, 你不需要指定網站根目錄:
1 | acme.sh --issue -d mydomain.com --apache |
如果你用的 nginx伺服器, 或者反代, acme.sh 還可以智能的從 nginx的配置中自動完成驗證, 你不需要指定網站根目錄:
1 | acme.sh --issue -d mydomain.com --nginx |
註意, 無論是 apache 還是 nginx 模式, acme.sh在完成驗證之後, 會恢復到之前的狀態, 都不會私自更改你本身的配置. 好處是你不用擔心配置被搞壞, 也有一個缺點, 你需要自己配置 ssl 的配置, 否則只能成功生成證書, 你的網站還是無法訪問https. 但是為了安全, 你還是自己手動改配置吧.
如果你還沒有運行任何 web 服務, 80 埠是空閑的, 那麼 acme.sh 還能假裝自己是一個webserver, 臨時聽在80 埠, 完成驗證:
1 | acme.sh --issue -d mydomain.com --standalone |
2、dns 方式, 在功能變數名稱上添加一條 txt 解析記錄, 驗證功能變數名稱所有權.
這種方式的好處是, 你不需要任何伺服器, 不需要任何公網 ip, 只需要 dns 的解析記錄即可完成驗證.
1 | acme.sh --issue --dns -d mydomain.com |
然後, acme.sh 會生成相應的解析記錄顯示出來, 你只需要在你的功能變數名稱管理面板中添加這條 txt 記錄即可.
等待解析完成之後, 重新生成證書:
1 | acme.sh --renew -d mydomain.com |
註意第二次這裡用的是 –renew
dns 方式的真正強大之處在於可以使用功能變數名稱解析商提供的 api 自動添加 txt 記錄完成驗證.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等數十種解析商的自動集成.
以 阿裡雲 為例, 你需要先登錄到阿裡雲 賬號, 然後控制台,右上角你的頭像里,有Access Key 然後:
1 2 | export Ali_Key="123123" export Ali_Secret="456456" |
1 | acme.sh --issue --dns dns_ali -d aa.com -d www.aa.com |
多個功能變數名稱就增加 -d www.bb.com
經過等待120秒後,證書就會自動生成,提示:
1 2 3 4 | [2018年 05月 20日 星期日 10:00:50 CST] Your cert is in /root/.acme.sh/domain.com/domain.com.cer [2018年 05月 20日 星期日 10:00:50 CST] Your cert key is in /root/.acme.sh/domain.com/domain.com.key [2018年 05月 20日 星期日 10:00:50 CST] The intermediate CA cert is in /root/.acme.sh/domain.com/ca.cer [2018年 05月 20日 星期日 10:00:50 CST] And the full chain certs is there: /root/.acme.sh/domain.com/fullchain.cer |
提示這個說明證書就生成成功了
這裡給出的Ali_Key 和Ali_Secret 會被自動記錄下來, 將來你在使用 aliyun api 的時候, 就不需要再次指定了. 直接生成就好了:
1 | acme.sh --issue -d mydomain2.com --dns dns_ali |
3、 copy/安裝 證書
前面證書生成以後, 接下來需要把證書 copy 到真正需要用它的地方.
註意, 預設生成的證書都放在安裝目錄下: ~/.acme.sh/, 請不要直接使用此目錄下的文件, 例如: 不要直接讓 nginx/apache 的配置文件使用這下麵的文件. 這裡面的文件都是內部使用, 而且目錄結構可能會變化.
正確的使用方法是使用 –installcert 命令,並指定目標位置, 然後證書文件會被copy到相應的位置, 例如:
1 2 3 4 | acme.sh --installcert -d domain.com \ --key-file /usr/local/nginx/conf/ssl/www.domain.cn.key \ --fullchain-file /usr/local/nginx/conf/ssl/www.domain.cn.cer \ --reloadcmd "service nginx reload" |
(一個小提醒, 這裡用的是 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 到最新版 :
1 | acme.sh --upgrade |
如果你不想手動升級, 可以開啟自動升級:
1 | acme.sh --upgrade --auto-upgrade |
之後, acme.sh 就會自動保持更新了.
你也可以隨時關閉自動更新:
1 | acme.sh --upgrade --auto-upgrade 0 |
好了,到此acme.sh的使用基本就是這些了,至於是採用HTTP還是DNS方式來申請證書?就經驗來看,我比較喜歡DNS的驗證方式,因為這種方式的依賴性最小,更加的靈活,我建議大家都用DNS來驗證申請Let’s Encrypt證書。
當然,acme.sh還有不少實用的參數可以方便我們來管理已經通過acme.sh申請過證書、功能變數名稱等等,比如:
1 | acme.sh --list |
這個就是列出當前已經申請到證書的功能變數名稱信息,如下圖:
具體的參數,大家可以使用 acme.sh --help
來查看。
6、NGINX安裝證書
PHP
1 2 3 4 5 6 7 8 9 | ssl on; ssl_certificate /usr/local/nginx/conf/ssl/www.domain.cer; ssl_certificate_key /usr/local/nginx/conf/ssl/www.domain.key; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets on; |
在站點配置文件裡加入以上代碼即可,證書路徑是第三步 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