如何加快 SSLHandshake?
我有一個與遠端伺服器建立 SSL 連接的 java 應用程序。
當我從我的開發機器(地理位置更靠近遠端伺服器,在不同的網路上,並且正在執行 Win7)執行應用程序時,連接只需不到一秒的時間即可完成。
當我從生產機器 ( Solaris ) 執行應用程序時,SSL 連接需要 10 多秒才能完成。
我想了解我可以做些什麼來加快這個連接時間。
我已打開調試跟踪(使用記錄經過時間的擴展列印流):
-Djavax.net.debug=全部
我可以看到大部分失去的時間發生在客戶端完成客戶端更改密碼規範之後,在寫入和讀取之間。
<Elapsed [4249]ms> *** Finished <Elapsed [4251]ms> *** <Elapsed [4251]ms> [write] MD5 and SHA1 hashes: len = 16 <Elapsed [4254]ms> Padded plaintext before ENCRYPTION: len = 48 <Elapsed [4258]ms> main, WRITE: TLSv1 Handshake, length = 48 <Elapsed [11230]ms> main, READ: TLSv1 Change Cipher Spec, length = 1 <Elapsed [11231]ms> JsseJce: Using cipher AES/CBC/NoPadding from provider SunJCE <Elapsed [11360]ms> main, READ: TLSv1 Handshake, length = 48 <Elapsed [11360]ms> Padded plaintext after DECRYPTION: len = 48 <Elapsed [11364]ms> *** Finished
我可以考慮哪些選項來幫助加快握手速度?
- 更新 JRE?伺服器目前在 1.4.2 上執行。
- 反向DNS?我已經看到一些建議,反向 DNS 可以幫助加快 SSL 握手。我的生產伺服器的開發伺服器目前都沒有使用反向 DNS。
- 網路故障排除 - 網路團隊表示網路正常嗎?
- 增加 CPU/記憶體 - 監控表明我們在握手期間沒有達到 100% 的記憶體或 CPU?
- /開發/隨機?我已經看到訪問 /dev/random 的參考資料,而在 solaris 上的握手中使用的隨機數據可能很慢?
–
參考:
本文詳細描述了 SSL 握手 - 向下滾動到 SSL 協議部分,該部分有圖表說明握手的 15 步過程:http:
//docs.oracle.com/javase/1.5.0 /docs/guide/security/jsse/JSSERefGuide.html#SSLOverview
本文介紹了顯示 SSL 握手的完整調試消息以供參考:
http ://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/ReadDebug.html
– 編輯
在問題網路內的另一台機器上進行的測試顯示了一些有趣的結果。SSL 握手的前 10 步發生的速度是原來的兩倍,但在“完成”階段的延遲寫入佔用了總握手時間的 80%。
<Elapsed [1816]ms> main, WRITE: TLSv1 Handshake, length = 48 <Elapsed [10078]ms> main, READ: TLSv1 Change Cipher Spec, length = 1
此問題的此特定實例的原因是伺服器上的反向 DNS 查找失敗。
這是由未在伺服器端獲取的客戶端 DNS 名稱伺服器的更改觸發的。
可以在客戶端和伺服器電腦上使用 Wireshark 隔離此問題,並且可以使用以下命令確認:dig
dig @namserverURL -x serverIP +trace
一旦解決了 DNS 問題,SSL 握手速度就會大大提高。
您是否嘗試過從同一站點的另一台機器連接,它仍然很慢嗎?遠端機器也是 Solaris 嗎?
如果您可以先在同一台機器上進行測試,我會說嘗試更新 JVM。
對於反向 dns,在 /etc/hosts 中放置一個條目就足夠了。
Solaris 機器是什麼型號和作業系統版本?有些有加密晶片,你可以試試看它是否啟用。