需求
公司有個非常重要的業(yè)務:為攝影師們提供獨立域名的個人網站建站服務。
考慮到安全性,及提升B格,我們給個人網站上了SSL手段。
從2017年起,各大證書商紛紛推出免費DV證書,讓這個任務實現(xiàn)了零成本。
但是阿里云每個賬號僅允許申請20個免費SSL證書,騰訊云再多也是50個。
當各個平臺的羊毛薅完一遍之后,還是不夠用,只能回到Let's Encrypt,頻繁地在sslforfree上人肉申請證書。
該證書唯一的最大的不足,就是只有90天有效期,這就帶來了后期非常繁瑣的重復性工作。
如何通過工具自動化地完成這個流程,就是本文要解決的問題。
關于acme.sh
ACME全稱The Automatic Certificate Management Environment,而acme.sh這個庫,則能夠在Linux上實現(xiàn)如下功能:
- 自動向Let's Encrypt申請證書;
- 自動調用各大云平臺的api接口實現(xiàn)TXT解析配置;
- 證書下發(fā)后自動部署到nginx;
- 利用定時器,每60天自動更新證書,并完成自動部署。
流程
部署環(huán)境:Ubuntu 14.06 + nginx,域名注冊與解析位于阿里云
安裝acme.sh
$ curl https://get.acme.sh | sh
或者
$ wget -O - https://get.acme.sh | sh
這個自動安裝過程完成了以下幾個步驟:
- 拷貝sh腳本到
~/.acme.sh/
- 創(chuàng)建alias別名
acme.sh=~/.acme.sh/acme.sh
- 啟動定時器
配置阿里云解析
運行如下命令,配置阿里云api接口的key和secret,其中的值需要到阿里云控制臺中去尋找。
$ export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
$ export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
這兩個配置將永久保存在文件~/.acme.sh/account.conf
中
為域名申請證書
運行如下命令,一鍵申請證書。
$ acme.sh --issue --dns dns_ali -d www.example.com
證書申請成功后,保存在~/.acme.sh/www.example.com
目錄下
將證書部署到nginx
運行如下命令,自動將證書部署到nginx。
$ acme.sh --install-cert -d www.example.com \
--key-file /path/to/keyfile/in/nginx/key.key \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "nginx -s reload"
該命令中的參數(shù)將自動保存在~/.acme.sh/www.example.com
目錄下的www.example.com.conf
文件里,定時器更新證書的時候實現(xiàn)自動部署。
配置nginx
在nginx的配置文件中配置如下:
server {
listen 80;
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate ./www.example.com.pem;
ssl_certificate_key ./www.example.com.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:20m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:3000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
調用方式
在服務器上部署一個小nodejs服務,通過調用該服務的api接口,來運行對應的腳本,就能夠實現(xiàn)新域名的證書申請+證書部署。
而證書的更新,就交給acme.sh,高枕無憂了~!