nginx https配置——Let's Encrypt 部署和維護

let’s encrypt

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
相關文章
相關標籤/搜索