无法连接到Heroku的PostgreSQL数据库。

15

我将使用一个简单的Java程序连接到我的Heroku Postgres数据库。但是,当我尝试连接时,出现了错误。有人可以解释一下问题或者解决这个问题吗?

谢谢 :D

代码:

public static void main(String[] args) throws InstantiationException,
        IllegalAccessException, ClassNotFoundException {
    System.out.println("-------- PostgreSQL "
            + "JDBC Connection Testing ------------");
    try {
        Class.forName("org.postgresql.Driver");
    } catch (ClassNotFoundException e) {
        System.out.println("Where is your PostgreSQL JDBC Driver? "
                + "Include in your library path!");
        e.printStackTrace();
        return;
    }
    System.out.println("PostgreSQL JDBC Driver Registered!");
    Connection connection = null;
    try {
        // ========>     from heroku website
        String url = "jdbc:postgresql://ec2-107-20-214-225.compute-1.amazonaws.com:5432/databasename";
        Properties props = new Properties();
        props.setProperty("user", "someusername");
        props.setProperty("password", "somepassword");
        props.setProperty("ssl", "true");
        connection = DriverManager.getConnection(url, props);
    } catch (SQLException e) {

        System.out.println("Connection Failed! Check output console");
        e.printStackTrace();
        return;
    }...

输出:

-------- PostgreSQL JDBC Connection Testing ------------
PostgreSQL JDBC Driver Registered!
Connection Failed! Check output console
org.postgresql.util.PSQLException: The connection attempt failed.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:225)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:138)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
...
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    ...

4
请参考以下链接:https://dev59.com/SWDVa4cB1Zd3GeqPf7Q_ 和 https://dev59.com/aWgt5IYBdhLWcg3wwwO- - Lukas Eklund
3个回答

26

感谢Lukas Eklund!

我的网址应该长这样:

String url = "jdbc:postgresql://ec2-107-20-214-225.compute-1.amazonaws.com:5432/databasename
?user=someusername&password=somepassword
&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory";

6
从安全的角度来看,通过不验证证书来绕过问题并不是一个好的选择。 - Chris Grenz
请参考 https://jdbc.postgresql.org/documentation/head/ssl-client.html 文档,了解如何正确设置并包含证书以进行验证。 - Markus

7

在数据库url中添加sslmode:

字符串 url = "jdbc:postgresql://ec2-107-20-214-225.compute-.amazonaws.com:5432/databasename?sslmode=require


我猜只是ssl而不是sslmode。 - Menai Ala Eddine - Aladdin

1
我遇到了同样的问题,但是我必须使用两个设置才能使它工作: String url = "jdbc:postgresql://ec2-107-20-214-225.compute-.amazonaws.com:5432/databasename?ssl=true&sslmode=require ssl=true 和 sslmode=require

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,