Я не могу подключить 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"




Java использует собственное хранилище ключей (вместо системного хранилища, используемое psql), которое не знает об этом конкретном сертификате и поэтому не доверяет ему.
Попробуйте использовать новейшую версию Java и / или проверьте документацию для экземпляра базы данных. Это должна быть известная проблема.
Если сертификат, используемый сервером 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, не могли бы вы объяснить еще немного шагов, которые вы сделали. У меня такая же проблема, когда ssl-соединение db работает из psql, но не из jdbc
Я уже пробовал это, создав keyStore и назначив свойства, которые "clientCertificateKeyStoreUrl" и "trustCertificateKeyStoreUrl", с путем к файлу keyStore. Результат был таким же, но я попробую другие версии Java. Клиент DataGrip может подключиться кстати. Большое спасибо.