原文? https://blog.wilddog.com/?p=749
主題 Https OpenSSL 性能優(yōu)化
HTTPS網(wǎng)站的普及使大家更加關(guān)注HTTPS性能優(yōu)化耐床,一般做HTTPS優(yōu)化可能只是針對PC端牲平,但在移動端的效果并不理想赠橙。去年Google就已經(jīng)在移動端做了HTTPS的性能加速,為Android平臺的Chrome瀏覽器上增加一個新的TLS加密套件:ChaCha20-Poly1305,是專門為移動設(shè)備推出的加密套件,為了能提供更好的安全和性能。
為了能夠更好的了解ChaCha20-Poly1305搏恤,先簡單介紹對稱加密和AES-NI。
對稱加密與AES-NI
對稱加密
在HTTPS握手過程湃交,通過非對稱加密協(xié)商出對稱加密密鑰熟空,然后使用對稱加密對雙方通信的數(shù)據(jù)內(nèi)容進(jìn)行加密。非對稱加密是服務(wù)器性能的開銷是巨大的巡揍,通過Session Resume等方法可以進(jìn)行加速痛阻。常見的非對稱加密算法有RSA、ECDHE等腮敌。
在協(xié)商出對稱加密密鑰后阱当,HTTPS中所有數(shù)據(jù)內(nèi)容通信的加密都使用對稱加密進(jìn)行俏扩。對稱加密分為流式加密和分組加密。
常見的流式加密算法有:RC4弊添,ChaCha20-Poly1305录淡。
常見的分組加密算法有:AES-CBC,AES-GCM油坝。
RC4由于存在嚴(yán)重安全漏洞嫉戚,已經(jīng)基本不再使用;AES-CBC容易遭受BEAST和LUCKY13攻擊澈圈,使用也逐漸減少彬檀,AES-GCM是它們的安全替代,AES-GCM也是目前最為流行的對稱加密算法瞬女。
安全風(fēng)險可參看ssllabs上的相關(guān)文章:https://community.qualys.com/blogs/securitylabs/2013/03/19/rc4-in-tls-is-broken-now-what
AES-NI
AES-GCM解決了對稱加密存在的安全問題窍帝,但帶來了性能問題。為此诽偷,出現(xiàn)了AES-NI(Advanced Encryption Standard New Instruction)坤学。AES-NI是Intel和AMD微處理器上x86架構(gòu)的一個擴(kuò)展,可以從硬件上加速AES的性能报慕,目前在服務(wù)器和PC端深浮,CPU對AES-NI的支持率已經(jīng)非常普及。
測試結(jié)果:服務(wù)器開啟AES-NI后眠冈,性能提高了5-8倍左右飞苇,這與Intel官方公布的數(shù)據(jù)基本是一致的。
測試方法:
可以使用OpenSSL測試也可以使用其他SSL庫測試洋闽,因?yàn)樗蠸SL庫都支持AES-128-GCM玄柠。
OpenSSL AES-NI = OFF
# OPENSSL_ia32cap=”~0x200000200000000″ openssl speed -elapsed -evp aes-128-gcm
OpenSSL AES-NI = ON
# openssl speed -elapsed -evp aes-128-gcm
關(guān)于AES-NI的指令集,推薦查看Shay Gueron編寫的《Intel 高級加密標(biāo)準(zhǔn) (AES) 指令集 (2010)》诫舅。https://software.intel.com/en-us/articles/intel-advanced-encryption-standard-aes-instructions-set
ChaCha20-Poly1305優(yōu)勢何在?
Google推出新的加密套件并在所有移動端的Chrome瀏覽器上優(yōu)先使用原因:
ChaCha20-Poly1305避開了現(xiàn)有發(fā)現(xiàn)的所有安全漏洞和攻擊宫患;
ChaCha20-Poly1305針對移動端設(shè)備大量使用的ARM芯片做了優(yōu)化刊懈,能夠充分利用ARM向量指令,在移動設(shè)備上加解密速度更快娃闲、更省電虚汛;
更加節(jié)省帶寬,Poly1305的輸出是16字節(jié)皇帮,而HMAC-SHA1是20字節(jié)卷哩,可以節(jié)省16%的overhead消耗。
通過實(shí)際的測試數(shù)據(jù)來看看ChaCha20-Poly1305在移動端使用的優(yōu)勢属拾。
測試一:
在支持AES-NI擴(kuò)展的設(shè)備上将谊,AES加密的性能優(yōu)勢是明顯的冷溶。 目前最為常用的對稱加密AES-128-GCM的性能是ChaCha20-Poly1305的近5倍。
由于原生的OpenSSL目前還不支持ChaCha20-Poly1305尊浓,通過編譯LibreSSL源碼(最新源碼下載地址:http://ftp.openbsd.org/pub/OpenBSD/LibreSSL)來進(jìn)行測試逞频。
測試方法:
進(jìn)入到編譯后的LibreSSL目錄,通過下面的命令測試栋齿。
./apps/openssl/openssl speed -elapsed -evp chacha
./apps/openssl/openssl speed -elapsed -evp aes-128-gcm
./apps/openssl/openssl speed -elapsed -evp aes-256-gcm
./apps/openssl/openssl speed -elapsed -evp aes-128-cbc
./apps/openssl/openssl speed -elapsed -evp aes-256-cbc
測試二:
在不支持AES-NI擴(kuò)展的移動設(shè)備上苗胀,ChaCha20-Poly1305的性能是AES-GCM的三倍左右。
對稱加密最合理的使用方法是:在支持AES-NI的設(shè)備上瓦堵,優(yōu)先使用AES-128-GCM加密套件基协;在不支持AES-NI的移動設(shè)備上,特別是ARM架構(gòu)的設(shè)備上菇用,優(yōu)先使用ChaCha20-Poly1305加密套件堡掏。
Nginx實(shí)現(xiàn)ChaCha20-Poly1305的三種方法
OpenSSL官方版本目前不支持ChaCha20-Poly1305,所以不能使用原生的OpenSSL版本刨疼。關(guān)注OpenSSL官方的動態(tài)(https://www.openssl.org/news/changelog.html )泉唁。
在Nginx上實(shí)現(xiàn)ChaCha20-Poly1305主流的方法有三種:
使用OpenBSD從OpenSSL fork的分支LibreSSL;
使用Google從OpenSSL fork的分支BoringSSL揩慕;
使用CloudFlare提供的OpenSSL Patch亭畜。
主流的三種方法,都已經(jīng)在服務(wù)器上部署成功并經(jīng)過流量測試迎卤,各有優(yōu)缺點(diǎn)拴鸵。具體的部署方法、Nginx配置蜗搔、部署過程可能會遇到的錯誤及解決方法劲藐,涉及的內(nèi)容太多,相關(guān)內(nèi)容如下:
Nginx編譯安裝BoringSSL
Nginx編譯安裝LibreSSL
Nginx編譯安裝CloudFlare提供的OpenSSL Patch
下面是我總結(jié)的這三種方法的優(yōu)缺點(diǎn)樟凄,這個歡迎大家補(bǔ)充聘芜。
LibreSSL
編譯安裝方法最為簡單;
OpenBSD小組對OpenSSL的代碼進(jìn)行了全面清理并重構(gòu)缝龄,更為輕量汰现;
已經(jīng)發(fā)布穩(wěn)定版本,相比于OpenSSL團(tuán)隊(duì)叔壤,問題修復(fù)更及時瞎饲。
BoringSSL
支持等價加密算法組功能(Equal preference cipher groups),這功能我認(rèn)為很有意思炼绘,在后面博客中再介紹嗅战;
與Nginx編譯友好性不足,編譯容易出錯俺亮,至少需要修改兩處源碼驮捍;
不支持OCSP Stapling功能疟呐。這一點(diǎn)是比較有意思的,Google工程師在博客上說OCSP Stapling存在缺陷厌漂,目前不支持萨醒,但不排除后面支持的可能性。聯(lián)想到Chrome瀏覽器默認(rèn)也不使用OCSP苇倡,可見Google對OCSP的情感是復(fù)雜的富纸。https://www.imperialviolet.org/2014/04/19/revchecking.html
OpenSSL Patch
編譯安裝過程較為復(fù)雜;
OpenSSL本身較重旨椒,存在的安全問題也多晓褪,需要頻繁升級版本;
穩(wěn)定性需要進(jìn)一步驗(yàn)證综慎。