如何在NGINX網(wǎng)站服務(wù)器中實(shí)施SSL完美前向保密技術(shù)?
譯文本文介紹了在Debian和Ubuntu系統(tǒng)平臺(tái)上實(shí)施完美前向保密(Perfect Forward Secrecy)以及NGINX網(wǎng)站服務(wù)器的過程。如果是其他GNU/Linux系統(tǒng),整個(gè)過程稍有變動(dòng)。
簡(jiǎn)而言之,完美前向保密可以確保“即便一個(gè)信息受危及,也不會(huì)拖累其他信息受危及;并確保沒有一個(gè)秘密值會(huì)導(dǎo)致多個(gè)消息受危及。”想了解更多信息,請(qǐng)參閱維基百科上的相關(guān)解釋:http://en.wikipedia.org/wiki/Forward_secrecy#Perfect_forward_secrecy。
當(dāng)openSSL中的Heartbleed安全漏洞于2014年年初公之于眾時(shí),這個(gè)事實(shí)顯得越來越清楚:對(duì)于在很大程度上采用SSL/TLS的任何系統(tǒng)而言,完美前向保密必不可少。
萬一你希望將自己的結(jié)果與我的結(jié)果進(jìn)行比較,可以在https://www.ssllabs.com/ssltest/analyze.html?d=indietorrent.org處測(cè)試我的參照實(shí)施方法,SSL證書鏈和發(fā)送的NGINX報(bào)頭可以在https://indietorrent.org處查看。
閑話少說,不妨配置NGINX來實(shí)施完美前向保密。
先不妨進(jìn)入到NGINX的配置目錄:
cd /etc/nginx/
我們需要生成安全性足夠強(qiáng)的Diffie-Hellman參數(shù)。一些人認(rèn)為,4096比特過長(zhǎng)了,會(huì)給系統(tǒng)的處理器帶來不必要的負(fù)擔(dān);但是就現(xiàn)在的計(jì)算能力而言,這似乎值得一試。想了解更多信息,請(qǐng)參閱下面的“參考資料”部分。
openssl dhparam -out dh4096.pem 4096
要是有這個(gè)配置文件很方便,該文件是專門針對(duì)手頭的任務(wù),在include文件中被劃分開來;這樣一來,更容易跨數(shù)量眾多的系統(tǒng)來實(shí)施完美前向保密。
vi /etc/nginx/perfect-forward-secrecy.conf
將下列內(nèi)容粘貼到上述文件中:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \
EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \
EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !MEDIUM";
ssl_dhparam dh4096.pem;
修改NGINX配置,以便加入上述文件,為此只要在http {}代碼段的末尾,將下面這一行插入到NGINX的主配置文件(默認(rèn)情況下主配置文件是/etc/nginx/nginx.conf):
#See:https://community.qualys.com/blogs/securitylabs/2013/08/05/configuring-apache-nginx-and-openssl-for-forward-secrecy
#This MUST come AFTER the lines that includes .../sites-enabled/*, otherwise SSLv3 support may be re-enabled accidentally.
include perfect-forward-secrecy.conf;
重啟NGINX,讓變更內(nèi)容生效:
service nginx restart
要是https://www.ssllabs.com/ssltest/analyze.html處的測(cè)試顯示紅色的Session resumption (caching) No (IDs assigned but not accepted),并且服務(wù)器實(shí)施了服務(wù)器名字指示(SNI),那就添加下列內(nèi)容到頂層的http {}代碼段(即添加到nginx.conf,就在我們之前所添加內(nèi)容的下面):
# See: http://forum.nginx.org/read.php?2,152294,152401#msg-152401
ssl_session_cache shared:SSL:10m;
同樣,重啟NGINX,讓變更內(nèi)容生效:
service nginx restart
上述測(cè)試應(yīng)該不再報(bào)告這個(gè)問題了(盡管這個(gè)問題并不降低總體測(cè)試分?jǐn)?shù))。
更深入一步:實(shí)施持續(xù)時(shí)間長(zhǎng)的HTTP嚴(yán)格傳輸安全(HSTS)協(xié)議
這部分很容易實(shí)現(xiàn),完全值得一試,前提是:
1.針對(duì)該報(bào)頭所設(shè)置的任何主機(jī),你想要強(qiáng)行要求使用SSL訪問所有資源(也就是相關(guān)網(wǎng)站上的每個(gè)網(wǎng)頁)。
2.你可以忍受不能夠接受和忽視針對(duì)該報(bào)頭所設(shè)置的任何主機(jī)而請(qǐng)求的任何資源的SSL提醒,比如“Domain Name Mismatch”等。HSTS的性質(zhì)恰恰在于,與SSL證書有關(guān)的警告和錯(cuò)誤條件無法被覆蓋。
我上網(wǎng)搜索了關(guān)于設(shè)置該報(bào)頭會(huì)不會(huì)可能給不支持報(bào)頭的瀏覽器帶來不必要的影響方面的信息,結(jié)果發(fā)現(xiàn)信息寥。但我能夠通過在瀏覽器(比如IE 6)中測(cè)試這個(gè)實(shí)施方法來消除我擔(dān)心的問題,沒有實(shí)施HSTS的瀏覽器完全忽視報(bào)頭。太棒了!
只要將下面幾行添加到/etc/nginx/perfect-forward-secrecy.conf的末尾,保存變更內(nèi)容:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
# This will prevent certain click-jacking attacks, but will prevent
# other sites from framing your site, so delete or modify as necessary!
add_header X-Frame-Options SAMEORIGIN;
重新加載(而不是重啟)將足以迫使NGINX采用這些特別的變更:
service nginx reload
可以證實(shí) HSTS按預(yù)期的方式運(yùn)行,只要在https://www.ssllabs.com/ssltest/analyze.html處證實(shí)這個(gè)實(shí)施方法。如果HSTS已正確實(shí)施,你應(yīng)該會(huì)在分?jǐn)?shù)正下方看到一個(gè)綠色框,顯示“This server supports HTTP Strict Transport Security with long duration. Grade set to A+.”意為“該服務(wù)器支持持續(xù)時(shí)間長(zhǎng)的HTTP嚴(yán)格傳輸安全協(xié)議。分?jǐn)?shù)被定為A+。”
祝賀你!
現(xiàn)在,你擁有了互聯(lián)網(wǎng)上最安全的SSL/TLS實(shí)施方法之一。
參考資料
https://community.qualys.com/blogs/securitylabs/2013/08/05/configuring-apache-nginx-and-openssl-for-forward-secrecy
原文地址:http://www.howtoforge.com/ssl-perfect-forward-secrecy-in-nginx-webserver