Let's Encrypt 的最大貢獻是它的 ACME 協議,第一份全自動服務器身份驗證協議,以及配套的基礎設施和客戶端。這是爲了解決一直以來 HTTPS TLS X.509 PKI 信任模型,即證書權威(Certificate Authority, CA)模型缺陷的一個起步。nginx
在客戶端-服務器數據傳輸中,公私鑰加密使得公鑰能夠明文傳輸而依然保密數據,但公鑰自己是否屬於服務器,或公鑰與服務器是否同屬一個身份,是沒法簡單驗證的。證書權威模型經過引入事先信任的第三方,由第三方去驗證這一點,並經過在服務器公鑰上簽名的方式來認證服務器。第三方的公鑰則在事先就約定並離線準備好,以備訪問時驗證簽名之用。這個第三方就稱爲證書權威,簡稱CA。相應的,CA驗證過的公鑰被稱爲證書。git
問題是,若是服務器私鑰泄露,CA沒法離線使對應的證書無效化,只能另外發布無效記錄供客戶端查詢。也就是說,在私鑰泄露到CA發佈無效記錄的窗口內,中間人能夠肆意監控服-客之間的傳輸。若是中間人設法屏蔽了客戶端對無效記錄的訪問,那麼直到證書過時,中間人均可以進行監控。而因爲當前CA驗證和簽發證書大多手動,證書有效期每每在一年到三年。github
Let's Encrypt 簽發的證書有效期只有90天,甚至但願縮短到60天。有效期越短,泄密後可供監控的窗口就越短。爲了支撐這麼短的有效期,就必須自動化驗證和簽發。由於自動化了,長遠而言,維護反而比手動申請再安裝要簡單。
下載腳本到本地:bash
wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.conf wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh chmod +x letsencrypt.sh
配置文件,須要指出其中的坑:服務器
let's encrypt的簽發過程當中須要對域名進行鑑權,因此會向域名所指向的根目錄寫入鑑權文件,也就是在根目錄新建目錄「.well-known/acme-challenge/」向其中寫入一個隨機文件,再訪問: <域名> /.well-known/acme-challenge/{隨機文件}以驗證域名全部權。 加密
因此,letsencrypt.conf文件配置說明:code
ACCOUNT_KEY="letsencrypt-account.key"//帳戶密鑰,能夠改爲自定義的標示,固然也能夠不改 DOMAIN_KEY="example.com.key"//域名私鑰 DOMAIN_DIR="/var/www/example.com"//域名鑑權目錄 DOMAINS="DNS:example.com,DNS:whatever.example.com"//要申請證書的域名,能夠一個,能夠多個 #ECC=TRUE #LIGHTTPD=TRUE
其中「DOMAIN_DIR」設置最好是配置一個單獨的路徑去作這個鑑權的事情:教程
好比此處須要給sunallies.com申請https證書,那麼ip
DOMAIN_DIR="/var/www/challenges/aishan100.com"//域名鑑權目錄
而後nginx的sunallies.com的站點配置中要加個目錄映射:ssl
location /.well-known/acme-challenge/{ alias /var/www/challenges/sunallies.com/.well-known/acme-challenge/; try_files $uri = 404; }
而後重啓nginx。
接着執行獲取證書:
在letsencrypt.sh文件末尾加上
nginx -s reload
保存letsencrypt.sh,接着執行
./letsencrypt.sh letsencrypt.conf
將會生成以下幾個文件
lets-encrypt-x1-cross-signed.pem example.chained.crt # 即網上搜索教程裏常見的 fullchain.pem example.com.key # 即網上搜索教程裏常見的 privkey.pem example.crt example.csr
在 nginx 裏添加 ssl 相關的配置
ssl_certificate /path/to/cert/example.chained.crt; ssl_certificate_key /path/to/cert/example.key;
cron 定時任務
每月自動更新一次證書。
0 0 1 * * /etc/nginx/certs/letsencrypt.sh /etc/nginx/certs/letsencrypt.conf >> /var/log/lets-encrypt.log 2>&1