OpenJDK 11 在 JDBC 连接字符串中使用 TLS 1.2

evi*_*obu 4 java mysql ssl jdbc

我的远程 MySQL 服务器只接受通过 TLS 1.2 的连接。如何在 JDBC (OpenJDK 11) 中选择协议版本?

SQL State: 28000
java.sql.SQLException: TLS version used does not meet minimal requirements
for this server. Please use a higher TLS version and retry.
Run Code Online (Sandbox Code Playgroud)
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.21</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我试过添加enabledSslProtocolSuites到我的连接字符串,但无济于事。

jdbc:mysql://{server}.mysql.database.azure.com:3306/{database_name}?
  serverTimezone=Australia/Melbourne&useSSL=true&requireSSL=true&enabledSslProtocolSuites=TLSv1.2
Run Code Online (Sandbox Code Playgroud)

-Djdk.tls.client.protocols="TLSv1.2" -Djavax.net.debug=all在启动时添加会mvn exec:java显示对使用 TLS 1.1 的Client Hello 的尝试。

javax.net.ssl|DEBUG|0C|azuremysqltest.App.main()|
2020-08-31 09:16:34.400 UTC|ClientHello.java:653|
Produced ClientHello handshake message (
"ClientHello": {
  "client version"      : "TLSv1.1",
  "random"              : "0D 94 D2 90 A7 C0 ...",
  "session id"          : "",
  "cipher suites"       : ...
Run Code Online (Sandbox Code Playgroud)

xer*_*593 7

您可以(显然)通过enabledTLSProtocols属性(8.0 参考)为 mysql 驱动程序(独立于 java 供应商)选择 TLS 版本:

  • 启用TLS协议

如果"useSSL"设置为"true",则覆盖在底层 SSL 套接字上启用TLS 协议。这可用于限制与特定 TLS 版本的连接。|自|版本 8.0.8|

在您的情况下,该值=TLSv1.2已批准工作。抱歉,我找不到有关此属性的(确切)值的参考,但我们可以进一步调查/获取支持的 ssl 协议版本,例如此处