Let's Encrypt SSL證書配置

HTTPS 那些事

鵝廠Bugly公眾號這篇《全站HTTPS來了》寫得比較全面了,不再廢話。

Let's Encrypt 介紹

Let's Encrypt 是一個免費、開放,自動化的證書頒發機構,由 ISRG(Internet Security Research Group)運作。

ISRG 是一個關注網絡安全的公益組織,其贊助商從非商業組織到財富100強公司都有,包括 Mozilla、Akamai、Cisco、Facebook,密歇根大學等等。ISRG 以消除資金,技術領域的障礙,全面推進加密連接成為互聯網標配為自己的使命。

Let's Encrypt 項目于2012年由 Mozilla 的兩個員工發起,2014年11年對外宣布公開,2015年12月3日開啟公測。

Let's Encrypt 目前處于公測期間,文檔,工具還不完善,請謹慎用于生產環境。

Let's Encrypt ?指南

Let's Encrypt 安裝

Let's Encrypt 目前僅支持 Unix-like 系統,需要 Python 2.6 或 2.7,暫不支持 Python 3。

可以使用 pip 安裝 Let's Encrypt 客戶端,或到其 wiki 上查看已打包的各操作系統安裝方式。

下面以官方推薦的 letsencrypt-auto 腳本為例進行安裝:


$ git clone https://github.com/letsencrypt/letsencrypt

$ cd letsencrypt

$ ./letsencrypt-auto --help

Let's Encrypt ?驗證方式

Let's Encrypt 使用兩種方式對申請的域名進行驗證:

1、 手動驗證 按照提示在申請證書的服務器上使用一個指定的URL提供一個指定的文件內容來進行驗證,進行手動驗證的服務器IP地址會被 Let's Encrypt 服務端記錄在案。

2、 自動驗證 在 目標服務器 (指域名解析對應的IP地址的服務器,下同)上運行客戶端,并啟動一個 80443 端口進行自動驗證。包括獨立模式和其他web sever驗證模式,在 Plugins 中詳細解釋

Let's Encrypt Plugins

Let's Encrypt 使用不同的 Plugins 來進行證書的獲取和安裝

Manual

當你在非 目標服務器 上申請證書,或希望進行手動驗證時,可以使用 manual 插件,運行命令:


$ ./letsencrypt-auto certonly --manual -d test.example.com

會得到提示:

manual-log-ip

選擇 Yes 繼續后,便會提示創建一個指定內容的 URL 用來驗證對域名及服務器的所有權,注意這個URL仍然需要部署在 目標服務器 上:


Make sure your web server displays the following content at

http://test.example.com/.well-known/acme-challenge/N4mCfskoOSX_7ikZDoEH3iyIqFAUg4Kdg36ecpeUwkw before continuing:

N4mCfskoOSX_7ikZDoEH3iyIqFAUg4Kdg36ecpeUwkw.J7NHjRSPwMW99A2XJv49FTnNu-MSCCebRjccMFZVRic

If you don't have HTTP server configured, you can run the following

command on the target server (as root):

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge

cd /tmp/letsencrypt/public_html

printf "%s" N4mCfskoOSX_7ikZDoEH3iyIqFAUg4Kdg36ecpeUwkw.J7NHjRSPwMW99A2XJv49FTnNu-MSCCebRjccMFZVRic > .well-known/acme-challenge/N4mCfskoOSX_7ikZDoEH3iyIqFAUg4Kdg36ecpeUwkw

# run only once per server:

$(command -v python2 || command -v python2.7 || command -v python2.6) -c \

"import BaseHTTPServer, SimpleHTTPServer; \

s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \

s.serve_forever()"

Press ENTER to continue

Standalone

使用獨立模式進行自動驗證,需要在 目標服務器 上運行 Let's Encrypt 客戶端,并指定 certonly--standalone參數。本模式需要綁定 80443 端口進行域名驗證,所以如果服務器上已有web server運行并偵聽這2個端口,則需要先關閉web server。

Webroot

如果 目標服務器 已有web server運行,并且不能夠關閉服務來獲取和安裝證書,可以使用 Webroot plugin。在運行 Let's Encrypt 客戶端時指定 certonly--webroot 參數,并使用 --webroot-path-w 參數來指定 webroot 目錄,比如 --webroot-path /usr/share/nginx/html

Apache

Apache plugin 可以用來為 Apache 2.4 服務器自動獲取和安裝證書,需要運行在基于 Debian 的操作系統上,并且要求1.0+以上版本的 libaugeas0。如需要運行 Apache plugin,在運行客戶端時指定 --apache 參數。本 plugin 仍處在 Alpha 階段。

Nginx

Nginx plugin 用于為 Nginx 服務器自動獲取和安裝證書,仍然處在實驗階段,并且 letsencrypt-auto 沒有安裝這個 plugin,如需使用,運行 pip install letsencrypt-nginx 進行安裝后,通過 --nginx 參數調用 plugin。

證書位置

所有版本已申請的證書放在 /etc/letsencrypt/archive下,/etc/letsencrypt/live是指向最新版本的符號鏈接。web server中關于證書的配置建議指向 live 目錄下的文件,以免證書更新后還需要更改配置。

每個域名一個目錄,主要包含以下幾個文件:

  • cert.pem 申請的服務器證書文件

  • privkey.pem 服務器證書對應的私鑰

  • chain.pem 除服務器證書外,瀏覽器解析所需的其他全部證書,比如根證書和中間證書

  • fullchain.pem 包含服務器證書的全部證書鏈文件

證書更新

Let's Encrypt 頒發的服務器證書有效期為90天,官方表示此為出于安全原因,降低錯發證書,證書泄漏的危害。通過自動續期來解決有效期短的問題,官方建議每2個月更新證書。

如果到期沒有更新證書,CA會向申請證書時提交的郵件地址發送提醒email。

自動續期可以使用 crontab 實現。注意更新證書后重啟 web server !

申請頻率限制

  • 注冊IP限制:每IP每3個小時不超過10次

  • 域名數量限制:每個域名(包含子域名)每7天不超過5個

安裝實踐

系統環境

獲取證書

由于 www.saxieyu.com 的 nginx 已在運行中,故使用 webroot 模式來獲取證書,使用命令:


$ ./letsencrypt-auto certonly --webroot --webroot-path /usr/share/nginx/html -d www.saxieyu.com --agree-tos --email admin@saxieyu.com

證書申請成功后會提示證書的文件路徑,以及證書到期時間:


IMPORTANT NOTES:

- Congratulations! Your certificate and chain have been saved at

/etc/letsencrypt/live/www.saxieyu.com/fullchain.pem. Your cert will

expire on 2016-04-01. To obtain a new version of the certificate in

the future, simply run Let's Encrypt again.

- If you like Let's Encrypt, please consider supporting our work by:

Donating to ISRG / Let's Encrypt:  https://letsencrypt.org/donate

Donating to EFF:                    https://eff.org/donate-le

配置Nginx

生成2048位 DH parameters:


$ sudo openssl dhparam -out /etc/ssl/certs/dhparams.pem 2048

接下來,修改 nginx 配置文件:


server {

    listen 443 ssl;

    server_name www.saxieyu.com;

    ssl_certificate /etc/letsencrypt/live/www.saxieyu.com/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/www.saxieyu.com/privkey.pem;

    ssl_dhparam /etc/ssl/certs/dhparams.pem;

    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

    ssl_prefer_server_ciphers  on;

    ……

}

配置 http 強制跳轉到 https:


server {

    listen 80;

    server_name www.saxieyu.com;

    return 301 https://$server_name$request_uri;

}

驗證服務器證書

如上修改過 nginx 配置,并 reload 過 nginx 服務后,使用瀏覽器訪問 https://www.saxieyu.com,驗證服務器證書是否正確生效

https

查看服務器證書信息

cert-info

使用 ssllabs 在線測試服務器證書強度及配置正確性

ssllabs

參考資料

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容