Как я могу обеспечить инициализацию TrustManagerFactoryImpl при подключении к базе данных MySQL с использованием SSL? - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь подключиться к управляемой базе данных 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 не инициализируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...