我正在使用亚马逊RDS MySQL
并使用SSL
证书(http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem提供的默认证书),我正在执行以下步骤:
mysql-ssl-ca-cert.pem
JKS
格式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
但我面临以下问题......
javax.net.ssl.SSLException: Unsupported record version Unknown-0.0
我该如何解决这个问题?
答案 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,而无需检查每个应用程序服务器。