Подключение к Google Cloud PostgreSQL через JDBC с SSL

Я не могу подключить Google Cloud PostgreSQL с JDBC.

Версия Java: 1.8.0_162

Версия PostgreSQL JDBC: 42.2.2

 try {
    Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
    System.out.println("Class not found");
}

String url = "jdbc:postgresql://ipaddresshere:5432/postgres";

Properties props = new Properties();
props.setProperty("user","postgres");
props.setProperty("password","passwordhere");

props.setProperty("ssl","true");
props.setProperty("sslcert","/Users/bguler/Desktop/GoogleCloudPGSSL/client-cert.pem");
props.setProperty("sslkey","/Users/bguler/Desktop/GoogleCloudPGSSL/client-key.pem");
props.setProperty("sslrootcert","/Users/bguler/Desktop/GoogleCloudPGSSL/server-ca.pem");

try {

    Connection conn = DriverManager.getConnection(url, props);
    System.out.println(conn);

} catch (SQLException ex) {

    System.out.println(ex.getMessage());

}

Я проверил, что пути сертификатов верны.

Выдает ошибку как;

Вызвано: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели

Ошибка SSL: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели

Я могу без проблем подключиться к терминалу через psql;

psql "sslrootcert=server-ca.pem \
  sslcert=client-cert.pem sslkey=client-key.pem \
  hostaddr=ipaddress \
  port=5432 \
  user=postgres dbname=postgres"
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 862
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Java использует собственное хранилище ключей (вместо системного хранилища, используемое psql), которое не знает об этом конкретном сертификате и поэтому не доверяет ему.

Попробуйте использовать новейшую версию Java и / или проверьте документацию для экземпляра базы данных. Это должна быть известная проблема.

Я уже пробовал это, создав keyStore и назначив свойства, которые "clientCertificateKeyStoreUrl" и "trustCertificateKeyStoreUrl", с путем к файлу keyStore. Результат был таким же, но я попробую другие версии Java. Клиент DataGrip может подключиться кстати. Большое спасибо.

bguler 14.09.2018 19:41
Ответ принят как подходящий

Если сертификат, используемый сервером Postgres, не является доверенным в хранилище доверенных сертификатов Java по умолчанию, вам необходимо его добавить.

Сначала преобразуйте свой сертификат в формат DER:

openssl x509 -outform der -in server-ca.pem -out server-ca.der

А после импортируйте его в хранилище ключей:

keytool -import -trustcacerts -alias your-alias -keystore cacerts -file server-ca.der

В качестве альтернативы вы можете использовать свойства системы Java, чтобы изменить используемое хранилище доверенных сертификатов, добавив параметры командной строки:

-Djavax.net.ssl.trustStore=<path to your trusstore>.jks -Djavax.net.ssl.trustStorePassword=<your password>

Также может быть полезно поместить классы Java SSL в отладку, добавив в командную строку запуска следующее:

-Djavax.net.debug=ssl,handshake:verbose

Я использую свои собственные файлы trustStore и keyStore. Свойства javax.net.ssl.trustStore и javax.net.ssl.keyStore работали для меня, которые я попробовал свойства clientCertificateKeyStoreUrl и trustCertificateKeyStoreUrl. Я думаю, преобразовывать pem в der не нужно. Спасибо.

bguler 19.09.2018 16:44

@bguler, не могли бы вы объяснить еще немного шагов, которые вы сделали. У меня такая же проблема, когда ssl-соединение db работает из psql, но не из jdbc

abisheksampath 25.10.2018 18:37

Другие вопросы по теме