Я пытаюсь подключиться к управляемой базе данных MySQL в Digital Ocean. Однако, когда я пытаюсь подключиться, я получаю «Сбой канала связи» и «IllegalStateException: TrustManagerFactoryImpl не инициализирован».
Мой тестовый код выглядит следующим образом:
import java.sql.SQLException;
import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
public class DBTest {
public static void main(String[] args) {
MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
dataSource.setUser("adminusername");
dataSource.setPassword("password");
dataSource.setServerName("db-example-nyc1-01-do-user-123456-0.db.ondigitalocean.com");
dataSource.setPort(25060);
dataSource.setDatabaseName("defaultdb");
dataSource.setTrustCertificateKeyStoreUrl("truststore.store");
dataSource.setTrustCertificateKeyStoreType("PKCS12");
dataSource.setTrustCertificateKeyStorePassword("changeme");
dataSource.setUseSSL(true);
try {
dataSource.getConnection();
System.out.println("SUCCESS");
} catch (SQLException e) {
System.out.println(e.getMessage());
System.out.println("FAIL");
e.printStackTrace();
}
}
}
Это приводит к следующему выводу:
4:13:13 PM: Executing task 'DBTest.main()'...
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :DBTest.main()
Communications link failure
Last packet sent to the server was 114 ms ago.
FAIL
BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 114 ms ago.
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2103)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:422)
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:137)
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:107)
at DBTest.main(DBTest.java:11)
Caused by: java.lang.IllegalStateException: TrustManagerFactoryImpl is not initialized
at java.base/sun.security.ssl.TrustManagerFactoryImpl.engineGetTrustManagers(TrustManagerFactoryImpl.java:102)
at java.base/javax.net.ssl.TrustManagerFactory.getTrustManagers(TrustManagerFactory.java:313)
at com.mysql.jdbc.ExportControlled.getSSLSocketFactoryDefaultOrConfigured(ExportControlled.java:237)
at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:79)
at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:4472)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1319)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031)
... 13 more
4:13:14 PM: Task execution finished 'DBTest.main()'.
TrustStore является действительным и содержит сертификат CA. Я могу подключиться к серверу MySQL через MySQL Workbench абсолютно нормально. Я могу подключиться к серверу, отличному от SSL MySQL, с помощью приведенного выше кода, исключив свойства TrustCertificate и UseSSL.
Было бы полезно узнать, почему TrustManagerFactoryImpl не инициализируется.