2012-01-19 134 views
12

(聲明:我決不發揮想象力安全專家,也不是一個窗口專家對於這個問題)的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握手成功了),但似乎解決了此問題。

感謝您的反饋,它是一個有趣的,如果徒勞的搜索。活到老,學到老。

+0

你可以顯示客戶端提出的密碼列表嗎? – Jonathan

+0

什麼是您正在使用的完整Java版本?另外:您是否在Java運行時安裝了Unlimited Strength Cryptography策略文件? –

+1

(您通常不需要添加BouncyCastle提供程序。)如果此應用程序使用「HttpsUrlConnection」,請嘗試設置此係統屬性:「https.protocols = SSLv3,TLS」。只是嘗試其他一些事情:'sun.security.ssl.allowUnsafeRenegotiation = true'(不推薦,以防萬一...)。在開啓調試時查看是否有更多細節也是有用的:'javax.net.debug = all'或者至少'javax.net.debug = handshake'。 – Bruno

回答

1

事實證明,我們使用的軟件使用HTTPs的自定義堆棧而不是默認值。雖然我不知道TLS請求的哪個部分觸發了錯誤(看到大多數TLSv1握手成功了),但似乎解決了此問題。

感謝您的反饋,它是一個有趣的,如果徒勞的搜索。活到老,學到老。

0

您可以閱讀我的文章detecting cipher strength(只是爲了確保您正確安裝了jce密碼)。在你的問題中,你說你安裝了無限制的密碼,但是你引用了128位和40位密鑰。所以,我對你有什麼感到困惑。另外,您是否可以檢查您嘗試連接的SSL證書上的密碼強度,並讓我們知道它是什麼以及算法是什麼?此外,請確保您的JDK策略文件具有允許無限強度的適當權限。

最後,您是否可以連接到「已知良好」SSL站點以正確驗證您的客戶端握手? (例如Gmail網頁)

+1

除了少數非常罕見的例外,希望使用SSL/TLS的用戶可以這樣做,因爲他們希望在客戶端和服務器之間建立安全連接。建議使用允許任何事情的信任管理器和接受任何事情的主機名驗證者,這些都會使所有這些都無用。請停止提示這些「解決方法」。當然,他們擺脫了警告,但他們也使MITM攻擊成爲可能。 – Bruno

+0

對不起,自從我回答以來,這個問題似乎已經發生了很大的變化。我的答案可能不再相關。 – djangofan