【发布时间】:2021-09-07 09:52:54
【问题描述】:
我可以通过 ProxySQL(使用 ssl)连接到 MariaDB 实例:
E:\>mysql -h 192.168.33.180 -P 6033 -u user --password=password --ssl
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 38364 Server version: 5.5.30 (ProxySQL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
但是当我尝试使用 Java 客户端进行连接时:
private static final String MARIADB_URL = "jdbc:mariadb://192.168.33.180:6033/offenderconnect";
private static final String MARIADB_USER = "user";
private static final String MARIADB_PASSWORD = "password";
private static final Properties properties = new Properties();
static {
properties.put("useSSL", "true");
properties.put("user", MARIADB_USER);
properties.put`enter code here`("password", MARIADB_PASSWORD);
}
...
try (Connection connectionMariaDB = DriverManager.getConnection(MARIADB_URL, properties)) {
异常输出是:
java.sql.SQLNonTransientConnectionException:无法连接到 地址=(主机=192.168.33.180)(端口=6033)(类型=主):不能 连接到 192.168.33.180:6033 :PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径 在 org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73) 在 org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:194) 在 org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1394) 在 org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:635) 在 org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:150) 在 org.mariadb.jdbc.Driver.connect(Driver.java:89) 在 java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677) 在 java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189) 在 com.gtl.datamigration.App.checkTable(App.java:211) 在 com.gtl.datamigration.App.lambda$5(App.java:447) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:829) 引起:java.sql.SQLNonTransientConnectionException:无法连接到 192.168.33.180:6033:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径 在 org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73) 在 org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:185) 在 org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createConnection(AbstractConnectProtocol.java:575) 在 org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1389) ... 10 更多原因:javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径 在 java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131) 在 java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:349) 在 java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:292) 在 java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:287) 在 java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1356) 在 java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(CertificateMessage.java:1231) 在 java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(CertificateMessage.java:1174) 在 java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) 在 java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:443) 在 java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421) 在 java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:182) 在 java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:171) 在 java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1418) 在 java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1324) 在 java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:440) 在 java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:411) 在 org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.sslWrapper(AbstractConnectProtocol.java:658) 在 org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createConnection(AbstractConnectProtocol.java:541) ... 11 更多原因:sun.security.validator.ValidatorException:PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径 在 java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:439) 在 java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306) 在 java.base/sun.security.validator.Validator.validate(Validator.java:264) 在 java.base/sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:313) 在 java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:222) 在 java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129) 在 java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1340) ... 24 更多原因:sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径 在 java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 在 java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 在 java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297) 在 java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:434) ... 30 更多
我尝试this 没有运气。
使用
-Djavax.net.debug=all
出现以下附加信息:
javax.net.ssl|DEBUG|0D|pool-1-thread-1|2021-06-23 15:05:34.869 COT|CertificateMessage.java:1171|Consuming server Certificate handshake message ( "Certificate": { "certificate_request_context": "", "certificate_list": [ {
"certificate" : {
"version" : "v3",
"serial number" : "60 D2 2A 99",
"signature algorithm": "SHA256withRSA",
"issuer" : "CN=ProxySQL_Auto_Generated_CA_Certificate",
"not before" : "2021-06-22 13:23:21.000 COT",
"not after" : "2031-06-20 13:23:21.000 COT",
"subject" : "CN=ProxySQL_Auto_Generated_Server_Certificate",
"subject public key" : "RSA"}
"extensions": {
<no extension>
} }, {
"certificate" : {
"version" : "v3",
"serial number" : "60 D2 2A 99",
"signature algorithm": "SHA256withRSA",
"issuer" : "CN=ProxySQL_Auto_Generated_CA_Certificate",
"not before" : "2021-06-22 13:23:21.000 COT",
"not after" : "2031-06-20 13:23:21.000 COT",
"subject" : "CN=ProxySQL_Auto_Generated_CA_Certificate",
"subject public key" : "RSA",
"extensions" : [
{
ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:false
PathLen: undefined
]
}
]}
"extensions": {
<no extension>
} }, ] } )
请给我一些提示尝试。
【问题讨论】:
-
堆栈跟踪提示 JVM 不信任远程证书
-
@ThorbjørnRavnAndersen,感谢您的来信。你知道如何让 JVM 信任这个远程证书吗?
标签: java ssl mariadb connection proxysql