怎么樣,看了上述有關 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安裝證書
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 證書的教程就講到這里了,后期如果積累新的經驗我會第一時間分析給大家的,大家有什么疑問也可以在下面的評論里提出來。