gpt4 book ai didi

java - 使用 SSL 的 MySQL JDBC 加密

转载 作者:行者123 更新时间:2023-11-30 23:44:31 25 4
gpt4 key购买 nike

MySQL 服务器(在 Red Hat 7 操作系统上运行的远程机器,MySQL 版本为 5.7.11)启用了 SSL,如下所示:

+---------------+--------------------------------+
| Variable_name | Value |
+---------------+--------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /var/lib/mysql/ca.pem |
| ssl_capath | |
| ssl_cert | /var/lib/mysql/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /var/lib/mysql/server-key.pem |

我正在尝试从我的本地计算机 (windows) 使用 SSL(不是身份验证)建立 JDBC 加密。下面是执行此操作的 JDBC 代码:

import java.sql.*;

public class MysqlConnect
{
public static void main (String[] args)
{
try
{
//System.setProperty("javax.net.ssl.trustStore", "cacerts");
//System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); ( Works with truststore values , but gives the error below without it)
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://IPAddress:3306/DBName?
verifyServerCertificate=false&useSSL=true&requireSSL=true";
String user = "root";
String password = "password";
Connection con = DriverManager.getConnection(url,user,password);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}

我已点击此链接创建证书:https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html.现在,如果我将服务器证书添加到 C:\Program Files\Java\jdk1.8\jre\lib\security\cacerts 并使用此信任库,我会在 wireshark 中看到一个加密连接,但是如果我不提供信任库名称和密码我收到以下错误(我这样做的原因是因为根据我的理解,与 ssl 身份验证不同,使用 ssl 的 jdbc 加密不需要客户端信任库参数):

javax.net.ssl.SSLHandshakeException
MESSAGE: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

STACKTRACE:

javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source) .

我的问题是,是否需要将服务器证书添加到客户端信任库(并提供信任库详细信息),即使尝试仅使用 ssl 进行 jdbc 加密(而不是 SSL 身份验证)?

我已经看到这个关联链接了:

JDBC parameter verifyServerCertificate=false connects without the need for a clientkeystore and truststore

但我仍然收到 verifyServerCertificate=false 的错误(它取决于 MySQL 版本还是使用自签名证书)?

最佳答案

该代码在不同的系统上运行良好,我可以建立安全连接,它失败的确切原因仍然未知,但这是我的假设 -> 即使我没有在我的 jdbc 代码中使用 cacerts(truststore)似乎远程服务器已将客户端身份保存在某处,并且仍在引用该身份。

如果有人面临类似的问题,您可以尝试重新创建服务器证书并重新启动您的数据库服务器,并且出于健全目的从信任库中删除相应的证书或创建并使用新的信任库。

在 wireshark 中你应该看到这样的东西:

1   source IP   Dest IP TLSv1.2 220 Client Hello
2 Dest IP source IP TLSv1.2 1140 Server Hello, Certificate, Server Key Exchange, Server Hello Done
3 source IP Dest IP TLSv1.2 129 Client Key Exchange
4 source IP Dest IP TLSv1.2 60 Change Cipher Spec
5 source IP Dest IP TLSv1.2 99 Encrypted Handshake Message

如果您在 wireshark 中看到此内容,则表示您现在已通过 ssl 加密链接进行连接(显然这只是一种变通方法,因为此行为的根本原因仍然未知)。

关于java - 使用 SSL 的 MySQL JDBC 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48688140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com