使用SSL访问RDS - 不支持的记录版本Unknown-0.0

时间:2012-11-20 11:30:49

标签: ssl rds

我正在使用亚马逊RDS MySQL并使用SSL证书(http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem提供的默认证书),我正在执行以下步骤:

  1. 下载mysql-ssl-ca-cert.pem
  2. 将上述文件修改为JKS格式
  3. 从网络应用程序通过Spring - Hibernate模板(org.springframework.beans.factory.config.PropertyPlaceholderConfigurer)进行连接并使用c3p0,我们将URL参数设置为jdbc:URL/DB?autoReconnect=true&useUniCode=true&characterEncoding=UTF-8&useSSL=true&verifyServerCertificate=false&requireSSL=true
  4. 但我面临以下问题......

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

    我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

基本上这意味着SSL解析器丢失了。套接字层已经传递了一些不符合SSL协议的字节。

使用SSL套接字进行传输时,它会调用格式化和加密例程来创建加密数据包。然后,它调用普通套接字层将加密数据包传输到服务器。服务器的套接字层接收数据包,然后调用SSL包来解密数据包。如果数据包不符合SSL格式,则会出现不受支持的版本异常。

到达套接字层的所有字节都将发送到SSL包。因此,获得该错误的最简单方法是在建立SSL连接后使用普通套接字层传输纯文本消息。

在我的特定情况下,我遇到了此错误消息,因为我正在传输额外的字节。让我们看看我能否清楚地解释我的错误。

我有一个缓冲区(例如)100个字节。我用50字节的消息打包缓冲区并调用SSL加密例程。生成的数据包长度为75个字节。我调用send()来传输缓冲区。这是一个普通的插座发送;它完成了我告诉它要做的事情,即传输整个100字节缓冲区。

在服务器上,收到了整个100个字节。 SSL包试图解密该数据包。它发现了一个非常好的SSL消息,它被打包到收到的前75个字节中。到现在为止还挺好。然后它试图弄清楚剩下的25个字节是什么意思。它认为这是一条SECOND SSL消息并试图解密它。那就是它窒息并踢出那个讨厌的例外。

我希望能为您提供一些关于在代码中查找内容的线索。

答案 1 :(得分: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 Server配置为仅允许TLSv1.1和TLSv1.2时,我收到以下异常:

     

引起:javax.net.ssl.SSLException:不支持的记录版本Unknown-0.0     在com.sun.net.ssl.internal.ssl.InputRecord.readV3Record(InputRecord.java:504)

     

在禁用TLSv1.0之前,应评估旧JRE的使用情况 - 幸运的是,PERFORMANCE_SCHEMA可以轻松调查客户端JRE,而无需检查每个应用程序服务器。