2012-11-20 63 views
5

我使用亞馬遜RDS MySQLSSL證書(可在http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem默認的證書),我做以下步驟連接:訪問RDS使用SSL - 不支持記錄版本未知,0.0

  1. 下載mysql-ssl-ca-cert.pem
  2. 通過Spring - Hibernate模板(org.springframework.beans.factory.config.PropertyPlaceholderConfigurer),也修改了上面的文件格式JKS
  3. 而從Web應用程序的連接使用c3p0,我們設置附加URL參數作爲jdbc:URL/DB?autoReconnect=true&useUniCode=true&characterEncoding=UTF-8&useSSL=true&verifyServerCertificate=false&requireSSL=true

但我面臨的問題,下面...

javax.net.ssl.SSLException: Unsupported record version Unknown-0.0 

我怎樣才能解決這個問題?

回答

4

基本上這意味着SSL解析器丟失了。套接字層已經傳遞了一些不符合SSL協議的字節。

使用SSL套接字傳輸時,它會調用格式化和加密例程來創建加密數據包。然後它調用普通套接字層將加密的數據包傳輸到服務器。服務器的套接字層接收數據包,然後調用SSL包來解密數據包。如果數據包不符合SSL格式,則會得到不支持版本的異常。

所有到達套接字層的字節都被髮送到SSL包。因此,獲取該錯誤的最簡單方法是在建立SSL連接後使用普通套接字層傳輸純文本消息。

在我的特殊情況下,我遇到了這個錯誤消息,因爲我正在傳輸額外的字節。讓我們看看我能否清楚地解釋我的錯誤。

我有一個(例如)100字節的緩衝區。我用50字節的消息打包了緩衝區,並將其稱爲SSL加密例程。結果數據包長度爲75個字節。我調用send()來傳輸緩衝區。這是一個普通的套接字發送;它做了我告訴它要做的事情,它傳輸了整個100字節的緩衝區。

在服務器上,收到了全部100個字節。 SSL包試圖解密數據包。它發現一個非常好的SSL消息打包在收到的前75個字節中。到現在爲止還挺好。然後試圖找出剩下的25個字節的含義。它確信它是第二個SSL消息,並試圖解密它。那是當它窒息並踢出那個討厭的例外。

我希望能爲您提供一些關於在代碼中尋找什麼的線索。

1

我發現這個錯誤,如果我提出了不支持的客戶端證書。清空「-Djavax.net.ssl.keyStore」並連接沒有客戶端證書的工作。

http://feed.askmaclean.com/archives/secure-java-connections-by-default.html參見:

各種TLS版本的支持有所不同基於使用的JRE版本。在限制特定的TLS版本之前,確保您知道您使用的JDK的功能。當第一次運行上述測試時,Eclipse使用的是JRE 1.6.0_45,而不是我預期的JRE 1.8.0_65,並且使用TLSv1.0密碼進行連接。當MySQL服務器配置爲僅允許TLSv1.1和TLSv1.2時,我收到以下異常:

引起:javax.net.ssl.SSLException:不支持的記錄版本未知-0.0 at com.sun.net .ssl.internal.ssl.InputRecord.readV3Record(InputRecord.java:504)

在禁用TLSv1.0之前應評估較舊的JRE的使用情況 - 幸運的是,PERFORMANCE_SCHEMA可以輕鬆地調查客戶端JRE而無需檢查每個應用程序服務器。

相關問題