【发布时间】:2018-07-19 04:18:42
【问题描述】:
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(不是 SSL 身份验证)进行 jdbc 加密,是否也需要将服务器证书添加到客户端信任库(并提供信任库详细信息)?。
我已经看过这个相关链接:
但我仍然收到 verifyServerCertificate=false 的错误(它取决于 MySQL 版本还是使用自签名证书)?
【问题讨论】:
-
当服务器证书未由有效的 CA 签名时,通常需要在 java 中将服务器证书添加到客户端信任库。您能否提供有关服务器证书的更多详细信息?您使用的是 JRE 信任库还是外部信任库?
-
@yopablo ,我正在做 ssl 加密而不是 ssl 身份验证,这需要将服务器证书添加到客户端信任库。我认为阅读 2 路 SSL 身份验证、1 路 SSL 身份验证和 ssl 加密将帮助您清除这个点。
-
如果您阅读文档(dev.mysql.com/doc/connector-j/5.1/en/…,“verifyServerCertificate”部分),它说您也需要使用“clientCertificateKeyStore”参数
标签: java mysql ssl encryption jdbc