简体   繁体   English

c3p0和Heroku postgres,SSL问题

[英]c3p0 and Heroku postgres, issues with SSL

UPDATED 更新

Can't connect to a postgres database. 无法连接到postgres数据库。 The dependency of postgres is added via maven. postgres的依赖性是通过maven添加的。

Maven dependency Maven依赖

<dependency>
 <groupId>postgresql</groupId>
 <artifactId>postgresql</artifactId>
 <version>9.1-901-1.jdbc4</version>
</dependency>

Postgres Pool Postgres池

public class PostgresDB implements DBPool {
public PostgresDB()  {
}

private static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();

static {
    try {
        Properties props = new Properties();
        props.setProperty("ssl", "false");
        comboPooledDataSource.setDriverClass( "org.postgresql.Driver" );
        comboPooledDataSource.setJdbcUrl("jdbc:postgresql://ec2-79-125-4-72.eu-west-1.compute.amazonaws.com:5432/d35hi5u7rnue7f");
        comboPooledDataSource.setUser("user");
        comboPooledDataSource.setPassword("xxxxxxxx");
        comboPooledDataSource.setProperties(props);
    } catch (Exception e) {
        System.out.println("Error");
        // handle the exception
    }
}

public Connection getConnection() throws SQLException {
    return comboPooledDataSource.getConnection();
}
}

Code for get a Connection 获取连接的代码

Connection connection = PostgresDB.getConnection();

Error 错误

WARNING: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@2326357e -- Acquisition Attempt Failed!!! 警告:com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@2326357e - 获取尝试失败!!! Clearing pending acquires. 清除待处理的收购。 While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). 在尝试获取所需的新资源时,我们未能成功超过允许的最大获取尝试次数(30)。 Last acquisition attempt exception: org.postgresql.util.PSQLException: Der Verbindungsversuch schlug fehl. 上次获取尝试异常:org.postgresql.util.PSQLException:Der Verbindungsversuch schlug fehl。 at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:152) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66) at org.postgresql.jdbc2.AbstractJdbc2Connection.(AbstractJdbc2Connection.java:125) at org.postgresql.jdbc3.AbstractJdbc3Connection.(AbstractJdbc3Connection.java:30) at org.postgresql.jdbc3g.AbstractJdbc3gConnection.(AbstractJdbc3gConnection.java:22) at org.postgresql.jdbc4.AbstractJdbc4Connection.(AbstractJdbc4Connection.java:32) at org.postgresql.jdbc4.Jdbc4Connection.(Jdbc4Connection.java:24) at org.postgresql.Driver.makeConnection(Driver.java:393) at org.postgresql.Driver.connect(Driver.java:267) at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:119) at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:143) at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataS at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:152)org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)at org.postgresql.jdbc2.AbstractJdbc2Connection。(AbstractJdbc2Connection.java: 125)org.postgresql.jdbc3.AbstractJdbc3Connection。(AbstractJdbc3Connection.java:30)org.postgresql.jdbc3g.AbstractJdbc3gConnection。(AbstractJdbc3gConnection.java:22)at org.postgresql.jdbc4.AbstractJdbc4Connection。(AbstractJdbc4Connection.java:32) at org.postgresql.jdbc4.Jdbc4Connection。(Jdbc4Connection.java:24)atg.postgresql.Driver.makeConnection(Driver.java:393)atg.postgresql.Driver.connect(Driver.java:267)at com.mchange .v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:119)位于com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:143)com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataS) ource.java:132) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137) at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014) at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32) at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810) at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:128) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264) at java.base/sun.security.ssl.TransportCo source.java:132)com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)at com .mchange.v2.resourcepool.BasicResourcePool.access $ 800(BasicResourcePool.java:32)at com.mchange.v2.resourcepool.BasicResourcePool $ AcquireTask.run(BasicResourcePool.java:1810)at com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:547)引起:javax.net.ssl.SSLHandshakeException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在java.base /中找到所请求目标的有效证书路径位于java.base / sun.security.ssl.TransportContext的java.base / sun.security.ssl.TransportContext.fatal(TransportContext.java:321)中的sun.security.ssl.Alert.createSSLException(Alert.java:128)。 java.base / sun.security.ssl.TransportCo上的致命(TransportContext.java:264) ntext.fatal(TransportContext.java:259) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:642) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:461) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:361) at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444) at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421) at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:178) at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1152) at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1063) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake ntext.fatal(TransportContext.java:259)位于java.base / sun.security.ssl.CertificateMessage $ T12CertificateConsumer.checkServerCerts(CertificateMessage.java:642),位于java.base / sun.security.ssl.CertificateMessage $ T12CertificateConsumer.onCertificate( CertificateMessage.java:461)java.base / sun.security.ssl.CertificateMessage $ T12CertificateConsumer.consume(CertificateMessage.java:361)at java.base / sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) java.base / sun.security上java.base / sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)的java.base / sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421) .ssl.TransportContext.dispatch(TransportContext.java:178)位于java.base / sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)java.base / sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl) .java:1152)在java.base / sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1063)java.base / sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:402) at java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:716) at java.base/sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:970) at java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81) at java.base/java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142) at org.postgresql.core.PGStream.flush(PGStream.java:523) at org.postgresql.core.v3.ConnectionFactoryImpl.sendStartupPacket(ConnectionFactoryImpl.java:259) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:105) ... 16 more Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385) at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:290) (SSLSocketImpl.java:402)java.base / sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:716)at java.base / sun.security.ssl.SSLSocketImpl $ AppOutputStream.write(SSLSocketImpl.java:970) )java.base / java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)at java.base / java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142)at org.postgresql.core.PGStream.flush( PGStream.java:523)org.postgresql.core.v3.ConnectionFactoryImpl.sendStartupPacket(ConnectionFactoryImpl.java:259)at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:105)... 16更多引起by:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在java.base / sun.security.validator.PKIXValidator.doBuild(PKIXValidator)中找到所请求目标的有效证书路径.java:385)at java.base / sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:290) at java.base/sun.security.validator.Validator.validate(Validator.java:264) at java.base/sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:321) at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:221) at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:626) ... 33 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) at java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) at java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297) at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) ... 39 more java.base / sun.security上java.base / sun.security.validator.Validator.validate(Validator.java:264)的java.base / sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:321) .ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:221)位于java.base / sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129),位于java.base / sun.security.ssl.CertificateMessage $ T12CertificateConsumer.checkServerCerts (CertificateMessage.java:626)... 33更多引起:sun.security.provider.certpath.SunCertPathBuilderException:无法在java.base / sun.security.provider.certpath.SunCertPathBuilder.build找到所请求目标的有效证书路径(SunCertPathBuilder.java:141)位于java.base / java.security.cert.CertPathBuilder.build的java.base / sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)(CertPathBuilder.java:297) )在java.base / sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)... 39更多

Fix 固定

If you have the same problem change the code to this: 如果您遇到同样的问题,请将代码更改为:

comboPooledDataSource.setJdbcUrl("jdbc:postgresql://url:port/database");

Properties props = new Properties();
props.setProperty("sslmode", "require");
props.setProperty("ssl", "true");
props.setProperty("sslfactory", "org.postgresql.ssl.NonValidatingFactory");
props.setProperty("user", "username");
props.setProperty("password", "xxxxxxx");
comboPooledDataSource.setProperties(props);

Instead of props.setProperty("ssl", "false"); 而不是props.setProperty("ssl", "false"); try: 尝试:

props.setProperty("sslmode", "disable");

For more info see Heroku's docs on Connecting to Relational Databases on Heroku with Java . 有关更多信息,请参阅Heroku 关于使用Java连接到 Heroku上的关系数据库的文档。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM