前言
如今的互聯網越來越不安全,我們每個人的信息以及隱私不斷被暴露,地下黑產盛行,經常收到垃圾短信,經常被陌生人的電話騷擾。我們的個人信息是怎么泄漏的呢?各種爬蟲無時無刻不在互聯網爬取着信息,各種嗅探工具無時無刻不在劫持着網絡數據包,各種大大小小互聯網公司因各種漏洞被脫庫。互聯網安全非常重要,如今很多大公司都強制使用https加密協議訪問,安全性有了很大的提高,最起碼數據包不能被劫持了,保證了客戶端與服務器端通訊安全性。服端配置加密協議訪問,在我的印象中是非常麻煩的,要搞老半天,而且不一定能跑起來。前段時間看了一篇講解部署https的文章,整個過程簡單自動化透明,而且證書是免費的,而且大部分主流操作系統主流瀏覽器都支持。在部署https之前需要對https協議以及CA證書以及CA有一定了解。
Let' encrypt
Let's encrypt是一家不以盈利為目的提供免費CA證書的機構,它旨在讓全世界所有的互聯網服務能夠簡單自動化部署加密協議,讓https能夠在所有的網站中普及。很多著名公司對其提供贊助,比如facebook,思科,mozilla等。它是對ACME(automated certificate management environment)協議的實現,只要實現了ACME協議的客戶端都可以跟它交互。
實現原理
這里根據自己的理解簡單描述下
1.生成用於授權對域名列表證書操作的RSA密鑰對
2.客戶端詢問Let's encrypt獲取證書需要做什么?
3.Let's encrypt告訴客戶端需要驗證是否真的持有域名以及授權私鑰,怎么驗證呢?告訴客戶端把隨機字符串保存在這個域名的根目錄下指定命名的文件中以及對指定的字段使用授權私鑰進行簽名並回傳
4.當客戶端告訴Let's encrypt完成了指定的任務時,服端開始驗證簽名的有效性,開始通過域名訪問指定生成的資源,當都驗證通過時,服端認為當前客戶端擁有指定域名,可以開始發證書了,當前密鑰對被授權用於當前域名相關操作,當前密鑰對被稱之為賬戶授權密鑰對
5.生成網站證書使用的RSA密鑰對,請求獲取證書時需要用到
6.根據協議生成CSR(certificate sign request)文件,發起CSR請求,請求Let's encrypt發DV(domain certificate)類型的證書
7.獲得證書之后,web服務器就可以開始配置https了
獲取證書
客戶端選擇
官方推薦的certbot需要安裝比較多的依賴,而且比較重,嘗試之后果斷放棄了。因為平時使用PHP開發,所以也嘗試使用了PHP編寫的客戶端,沒有發現滿意的,也果斷放棄了。前幾天在搜索我之前看到的那篇文章時,那篇文章沒有搜索到,搜索到了其它相關的一些文章,其中有篇文章提到了一個很簡潔的客戶端acme_tiny,使用python實現的,看起來不錯,就使用它了。
生成賬戶私鑰對
設置驗證域名合法性路徑的服端配置並重啟服務器(NGINX為例)
location ~ /.well-known/acme-challenge/(.*)? {
root /u01/server/cert/www;
try_files /$1 =404;
}
生成網站證書私鑰對
生成CSR文件
獲取證書
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /u01/server/cert/www/ > ./signed.crt
獲取中間證書
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
合並證書
cat signed.crt intermediate.pem > chained.pem
NGINX服務器配置
server {
listen 443;
server_name yoursite.com;
charset utf-8;
root yourroot;
index index.php index.html index.htm;
ssl on;
ssl_certificate /u01/server/cert/chained.pem;
ssl_certificate_key /u01/server/cert/domain.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
ssl_session_cache shared:SSL:50m;
ssl_prefer_server_ciphers on;
}
chrome顯示效果
需要注意的地方
1.證書有效期是90天
2.為了避免濫用,一周內同一個域名只能生成20次
3.開發客戶端時,可以使用沙盒環境
4.為了避免證書過期,可以寫一個shell腳本自動更新證書
5.使用第三方工具測試OpenSSL是否包含心臟漏血漏洞
6.Let's encrypt創建比較晚,很多老設備老終端老系統可能不能識別
7.腳本需要依賴一些python模塊,按照提示安裝即可
后記
整個部署過程挺順利的,在部署之前花了一些時間了解相關的文檔。使用安全加密協議是有代價的,響應速度比普通協議訪問速度慢了將近一倍。
參考資料
【1】Let' encrypt
https://letsencrypt.org/
【2】How it works?
https://letsencrypt.org/how-it-works/
【3】證書簽名
https://letsencrypt.org/certificates/
【4】acme協議
https://tools.ietf.org/html/draft-ietf-acme-acme-01
【5】let's encrypt docs
https://letsencrypt.org/docs/
【6】acme_tiny
https://github.com/diafygi/acme-tiny/tree/ecd26b1e784973e5b52d5a308964a8e29a6cf207