Подключение к Google Cloud PostgreSQL через JDBC с SSL - PullRequest
0 голосов
/ 14 сентября 2018

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

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Если сертификат, используемый сервером 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
0 голосов
/ 14 сентября 2018

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

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

...