如今愈來愈多的網站或服務增長了 HTTPS 證書,蘋果 AppStore、微信小程序等也已強制要求開發者需提供 HTTPS 的後端接口。在阿里雲 / 騰訊雲上有一年期的免費賽門鐵克 SSL 證書可供嚐鮮,但續用則須要付費。nginx
Let's Encrypt 做爲一個公共且免費 SSL 的項目逐漸被廣大用戶傳播和使用,是由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等組織人員發起,主要的目的也是爲了推動網站從 HTTP 向 HTTPS 過分的進程,目前已經有愈來愈多的商家加入和贊助支持。web
而 Certbot 是由 Let’s Encrypt 官方推薦的一款快速得到網站加密證書的 Python 腳本,簡單易用。apache
可是在 CentOS 6.* 環境下,因爲 Python 的版本問題(系統自帶的 Python 是 2.6 版本,可是因爲業務須要,又安裝了 2.7 版本的 Python),一直會有各類各樣的報錯,StackOverflow 和 Github 上也沒有找到好的解決方案。小程序
好在 Let’s Encrypt 推薦了多種其餘語言版本的工具用來快速獲取證書。https://letsencrypt.org/docs/client-options/後端
在此,我選擇了 acme.sh 這一 Bash 腳本,安裝較 Certbot 更方便。微信小程序
主要步驟以下:api
安裝很簡單,一個命令:瀏覽器
curl https://get.acme.sh | sh
普通用戶和 root 用戶均可以安裝使用.bash
安裝過程進行了如下幾步:服務器
1) 把 acme.sh 安裝到你的 home 目錄下:
~/.acme.sh/
並建立 一個 bash 的 alias, 方便你的使用: acme.sh=~/.acme.sh/acme.sh
2). 自動爲你建立 cronjob, 天天零點自動檢測全部的證書, 若是快過時了, 須要更新, 則會自動更新證書,能夠經過 crontab -l
查看
2 0 * * *"/root/.acme.sh"/acme.sh --cron --home"/root/.acme.sh"> /dev/null
** 安裝過程不會污染已有的系統任何功能和文件 **, 全部的修改都限制在安裝目錄中: ~/.acme.sh/
acme.sh 實現了 acme 協議支持的全部驗證協議.
通常有兩種方式驗證: http 和 dns 驗證.
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
只須要指定域名, 並指定域名所在的網站根目錄. acme.sh 會全自動的生成驗證文件, 並放到網站的根目錄, 而後自動完成驗證. 最後會聰明的刪除驗證文件. 整個過程沒有任何反作用.
若是你用的 apache 服務器, acme.sh 還能夠智能的從 apache 的配置中自動完成配置, 你不須要指定網站根目錄:
acme.sh --issue -d mydomain.com --apache
若是你尚未運行任何 web 服務, 80 端口是空閒的, 那麼 acme.sh 還能僞裝本身是一個 webserver, 臨時聽在 80 端口, 完成驗證:
acme.sh --issue -d mydomain.com --standalone
這種方式的好處是, 你不須要任何服務器, 不須要任何公網 ip, 只須要 dns 的解析記錄便可完成驗證.
acme.sh --issue --dns -d mydomain.com
而後, acme.sh 會生成相應的解析記錄顯示出來, 你只須要在你的域名管理面板中添加這條 txt 記錄便可.
等待解析完成以後, 從新生成證書:
acme.sh --renew -d mydomain.com
注意第二次這裏用的是 --renew
dns 方式的真正強大之處在於可使用域名解析商提供的 api 自動添加 txt 記錄完成驗證.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等數十種解析商的自動集成.
以 dnspod 爲例, 你須要先登陸到 dnspod 帳號, 生成你的 api id 和 api key, 都是免費的.
而後:
export DP_Id="1234" export DP_Key="sADDsdasdgdsf" acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
證書就會自動生成了. 這裏給出的 api id 和 api key 會被自動記錄下來, 未來你在使用 dnspod api 的時候, 就不須要再次指定了.
直接生成就行了:
acme.sh --issue -d mydomain2.com --dns dns_dp
以 nginx 爲例。
http { # 新增 server { listen 80 default_server; # 新增 listen 443 ssl; ssl_certificate /etc/nginx/ssl/mydonain.cer; ssl_certificate_key /etc/nginx/ssl/mydomain.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; # 兼容其餘老瀏覽器的 ssl_ciphers 設置請訪問 https://wiki.mozilla.org/Security/Server_Side_TLS # 其餘省略 } }
前面證書生成之後, 接下來須要把證書 copy 到真正須要用它的地方.
注意, 默認生成的證書都放在安裝目錄下: ~/.acme.sh/
, 請不要直接使用此目錄下的文件, 例如: 不要直接讓 nginx/apache 的配置文件使用這下面的文件. 這裏面的文件都是內部使用, 並且目錄結構可能會變化.
正確的使用方法是使用 --installcert
命令, 並指定目標位置, 而後證書文件會被 copy 到相應的位置,
例如:
acme.sh --installcert -d mydomain.com --key-file /etc/nginx/ssl/mydomain.key --fullchain-file /etc/nginx/ssl/mydonain.cer
最後,重啓 nginx 服務:
service nginx force-reload
這裏用的是 service nginx force-reload
, 不是 service nginx reload
, 據測試, reload
並不會從新加載證書, 因此用的 force-reload
。
目前證書在 60 天之後會自動更新, 你無需任何操做. 從此有可能會縮短這個時間, 不過都是自動的, 你不用關心.
目前因爲 acme 協議和 letsencrypt CA 都在頻繁的更新, 所以 acme.sh 也常常更新以保持同步.
升級 acme.sh 到最新版 :
acme.sh --upgrade
若是你不想手動升級, 能夠開啓自動升級:
acme.sh --upgrade --auto-upgrade
以後, acme.sh 就會自動保持更新了.
你也能夠隨時關閉自動更新:
acme.sh --upgrade --auto-upgrade 0