(聲明:我決不發揮想象力安全專家,也不是一個窗口專家對於這個問題)的TLSv1握手失敗
設置:在我們這邊
- 服務器:Java 1.6的(已添加BouncyCastle的到安全文件),在Windows 2003服務器
- 第三方客戶端:Windows 2008的服務器與BizTalk
- 由於重新談判的攻擊引入的所有重新談判系統屬性「啓用」在服務器端(不是安全的,我知道)
理想情況下,我們希望在我們的最後解決這個問題,但如有必要,可以向客戶端提出修復建議。
客戶端服務器有超過一個HTTPS連接連接到我們的服務器,但它總是失敗,Wireshark的顯示了以下的對話:
> TLSv1: Client Hello
< TLSv1: Alert (21): Unexpected Message
,按照RFC(http://www.ietf.org/ rfc/rfc2246.txt)警報(21)是指一個失敗的解密,從我在wireshark中可以看到的情況來看,客戶端建議的密碼實際上都不被JRE 1.6支持(按照http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html#SupportedCipherSuites) 爲了重現錯誤能夠仔細檢查它,我用一些其他軟件測試:
- wfetch在Windows XP上以「https」選擇將在的SSLv2執行初始客戶端握手,則服務器將切換到的TLSv1回答,這個工作在Windows XP上與配置
- wfetch用「使用TLSv1」爲初始握手將以同樣的方式作爲BizTalk服務器上配置有「HTTPS」 2008窗口
- wfetch將採用「使用TLSv1」爲初始握手和以同樣的方式作爲BizTalk服務器
- IE失敗(在Windows XP)失敗會最初嘗試使用具有相同失敗結果的TLSv1握手,但立即再次嘗試使用工作爲 的SSLv3(此時我將所有Microsoft軟件使用的中央配置均可在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentCo ntrolSet \控制\ SecurityProviders \ Schannel中)
- Firefox使用的SSLv3對於整個會話,因此不存在問題
- OpenSSL的當它回答,沒有問題出現
- 執行中的SSLv2初始握手,並且服務器切換到使用TLSv1 OpenSSL的可強制執行初始握手中的TLSv1爲好,它提供了27個密碼列表(而不是由基於Windows的軟件提出了11個密碼),並可以在不出現問題
連接到我的未經訓練這強化了一個觀點,即不兼容的密碼命題是Windows僅支持密碼套件的根源at不支持JVM(對於TLSv1)。 我已經在java.security文件中安裝了bouncy castle作爲附加提供程序,但無濟於事。 我搜索了高和低,只發現可能websphere支持TLSv1的Windows密碼,但沒有辦法下載獨立提供程序來測試它的參考。 JRE 1.7不支持我們在JVM上運行的軟件,因此升級不是一種選擇(也許安全提供商可以安全降級?雖然我還沒有找到它的下載) 我發現沒有辦法將密碼添加到windows短編寫c + +代碼(我已經玩過上述提到的註冊表設置沒有效果)。
所以在最後我想知道以下情況之一會解決它,他們應該如何來完成:
- 提供商加入到可與由Windows所提出的密碼進行的TLSv1工作JVM
- 某種方式強迫客戶端做的SSLv3(最好不要的SSLv2)初始握手,或者如果使用TLSv1握手失敗
- 某種方式爲使用TLSv1添加JVM-支持的密碼到客戶端窗口至少重試
當然也讚賞任何其他解決方案。
編輯
Java版本是Java version (64 bit): 1.6.0_19-b04
。
提出密碼列表是:
- TLS_RSA_WITH_RC4_128_MD5
- TLS_RSA_WITH_RC4_128_SHA
- TLS_RSA_WITH_3DES_EDE_CBC_SHA
- TLS_RSA_WITH_DES_CBC_SHA
- TLS_RSA_EXPORT1024_WITH_RC4_56_SHA
- TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA
- TLS_RSA_EXPORT_WITH_RC4_40_MD5
- TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5
- TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
- TLS_DHE_DSS_WITH_DES_CBC_SHA
- TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA
的無限強度加密政策文件安裝。我試圖設置javax.net.debug=all
並從控制檯啓動服務器,不出現額外的輸出。我已經設置sun.security.ssl.allowUnsafeRenegotiation=true
無濟於事。
EDIT 2
事實證明,我們所使用的軟件用於HTTPS的自定義堆棧,而不是默認的。雖然我不知道TLS請求的哪個部分觸發了錯誤(看到大多數TLSv1握手成功了),但似乎解決了此問題。
感謝您的反饋,它是一個有趣的,如果徒勞的搜索。活到老,學到老。
你可以顯示客戶端提出的密碼列表嗎? – Jonathan
什麼是您正在使用的完整Java版本?另外:您是否在Java運行時安裝了Unlimited Strength Cryptography策略文件? –
(您通常不需要添加BouncyCastle提供程序。)如果此應用程序使用「HttpsUrlConnection」,請嘗試設置此係統屬性:「https.protocols = SSLv3,TLS」。只是嘗試其他一些事情:'sun.security.ssl.allowUnsafeRenegotiation = true'(不推薦,以防萬一...)。在開啓調試時查看是否有更多細節也是有用的:'javax.net.debug = all'或者至少'javax.net.debug = handshake'。 – Bruno