【问题标题】:Connection to Google Cloud PostgreSQL via JDBC with SSL通过带有 SSL 的 JDBC 连接到 Google Cloud PostgreSQL
【发布时间】:2019-02-19 11:48:06
【问题描述】:

我无法将 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 postgresql ssl google-cloud-sql


    【解决方案1】:

    如果 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 System 属性通过添加命令行参数来更改使用的信任库:

    -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 你能解释一下你所做的更多步骤吗?我有同样的问题,其中 db ssl 连接来自 psql,但不是来自 jdbc
    【解决方案2】:

    Java 使用它自己的密钥存储(而不是 psql 使用的系统存储),它不知道这个特定的证书,因此不信任它。

    尝试使用最新版本的 Java 和/或查看数据库实例的文档。这应该是一个已知问题。

    【讨论】:

    • 我已经尝试过通过生成 keyStore 并使用 keyStore 文件路径提供“clientCertificateKeyStoreUrl”和“trustCertificateKeyStoreUrl”属性。结果是一样的,但我会尝试另一个 java 版本。 DataGrip 客户端可以顺便连接。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多