我无法将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.SunCertPathBuilder异常:找不到所请求目标的有效证书路径
SSL 错误:sun.security.validator.Validator异常:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilder异常:找不到所请求目标的有效证书路径
我可以通过 psql 在终端上连接没有问题;
psql "sslrootcert=server-ca.pem
sslcert=client-cert.pem sslkey=client-key.pem
hostaddr=ipaddress
port=5432
user=postgres dbname=postgres"
如果 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
Java 使用自己的密钥存储(而不是 psql 使用的系统存储(,它不知道这个特定的证书,因此不信任它。
尝试使用最新版本的 Java 和/或查看数据库实例的文档。这应该是一个已知问题。