5

我正在使用 AmazonRDS MySQL并连接SSL证书(默认证书可在http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem获得),我正在执行以下步骤:

  1. 下载了mysql-ssl-ca-cert.pem
  2. 将上述文件修改为JKS格式化
  3. Spring - Hibernate并通过模板( )从Web应用程序连接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

我怎样才能解决这个问题?

4

2 回答 2

4

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

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

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

在我的特殊情况下,我遇到了这个错误消息,因为我正在传输额外的字节。让我们看看我是否可以清楚地解释我的错误。

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

在服务器上,接收到全部 100 个字节。SSL 包试图解密包。它发现在收到的前 75 个字节中包含了一个非常好的 SSL 消息。到目前为止,一切都很好。然后它试图弄清楚剩下的 25 个字节是什么意思。它假定这是第二条 SSL 消息并试图对其进行解密。就在那时它窒息并踢出了那个讨厌的例外。

我希望这能给你一些关于在你的代码中寻找什么的线索。

于 2013-01-09T23:53:22.327 回答
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: com.sun.net.ssl.internal.ssl.InputRecord.readV3Record(InputRecord.java:504) 上不支持的记录版本 Unknown-0.0

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

于 2016-07-04T09:58:19.040 回答