【问题标题】:How to connect with PostgreSQL database over SSL?如何通过 SSL 连接 PostgreSQL 数据库?
【发布时间】:2016-09-20 12:23:26
【问题描述】:

我已经创建了自己的证书并配置了postgresql.conf文件:

...
#authentication_timeout = 1min          # 1s-600s
ssl = true                              # (change requires restart)
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
                                        # (change requires restart)
#ssl_prefer_server_ciphers = on         # (change requires restart)
#ssl_ecdh_curve = 'prime256v1'          # (change requires restart)
ssl_cert_file = '/etc/ssl/certs/company/database/certificate'           # (change requires restart)
ssl_key_file = '/etc/ssl/certs/company/database/key'            # (change requires restart)
ssl_ca_file = '/usr/share/ca-certificates/company/ca/certificate'                        # (change requires restart)
#ssl_crl_file = ''                      # (change requires restart)
#password_encryption = on
#db_user_namespace = off
#row_security = on
...

然后,我允许我的服务器连接到我的数据库,pg_hba.conf

...
hostssl    postgres             postgres             XXX.XXX.XXX.XXX/0            md5
...

所以,我可以通过psql 命令行连接到它:

psql (9.5.3)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

但是,当我尝试通过我的 java 应用程序打开与数据库的连接时,即使我提供包含我的数据库证书的信任库,我仍然无法与它建立连接:

mvn package -Djavax.net.ssl.trustStore=/opt/app/truststore -Djavax.net.ssl.trustStorePassword=changeit

例外:

2016-05-23 16:28:32,900 WARN [com.mchange.v2.resourcepool.BasicResourcePool] - <Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@75fa1be3 is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.>
2016-05-23 16:28:32,900 WARN [com.mchange.v2.resourcepool.BasicResourcePool] - <com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@2be057bf -- Acquisition Attempt Failed!!! 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). Last acquisition attempt exception: >
java.lang.NullPointerException
    at org.postgresql.Driver.parseURL(Driver.java:532)
    at org.postgresql.Driver.acceptsURL(Driver.java:431)
    at java.sql.DriverManager.getDriver(DriverManager.java:299)
    at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:285)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:161)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:161)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:147)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:202)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
2016-05-23 16:28:32,901 WARN [com.mchange.v2.resourcepool.BasicResourcePool] - <Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@75fa1be3 is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.>

通过psql 一切似乎都运行良好,而不是我的应用程序。 有什么建议吗?

编辑:

我的props.properties 文件:

uatDb.user=postgres
uatDb.password=password
uatDb.driverClass=org.postgresql.Driver
uatDb.jdbcUrl=jdbc:postgresql://<server_name>:1234/uat?ssl=true
uatDb.port=5443
uatDb.name=uat
uatDb.host=<server_name>

【问题讨论】:

  • 发布您的 Java 代码。您是否正在设置 SSL 的连接属性?见jdbc.postgresql.org/documentation/head/connect.html
  • @AndrewHenle 是的,我已经在文件上设置了此连接的属性。我已经编辑了我的问题。我正在通过maven 调用我的数据库来构建我的应用程序,该应用程序可以访问我的数据库以进行一些测试。
  • 假设您的连接工作没有启用 SSL,您可以在 MAVEN_OPTS 中设置-Djavax.net.debug=all 以获取 Java 连接调试数据吗?见stackoverflow.com/questions/2007192/…(我不是 Maven 大师...)

标签: java postgresql ssl


【解决方案1】:

我相信也需要一个密钥库。由于 ssl=true 应该需要您的自签名证书的私钥。我还会添加“nonValidating SSLFactory”设置

?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

另外,server_name:1234 的端口设置与5432 不匹配。

"parseUrl" 是一个空错误,可能 JDBC url 中的某个变量设置不正确。

【讨论】:

  • “org.postgresql.ssl.NonValidatingFactory”工厂绕过所有 SSL 证书验证,使 SSL 连接毫无意义。
  • 不确定&amp;amp; 是否正确或必要。对我来说,它只适用于&amp;
【解决方案2】:
url=jdbc:postgresql://<host_url_or_ip>:<port>/<db_name>?currentSchema=<schema_name>&sslmode=verify-ca&sslfactory=org.postgresql.ssl.DefaultJavaSSLFactory

注意:如果schema_namepublic,则不需要。但是端口即使是默认的,即 5432,你也必须提供它。

对于 sslmode 值参考:https://jdbc.postgresql.org/documentation/head/ssl-client.html 设置sslfactory=org.postgresql.ssl.DefaultJavaSSLFactory 以启用验证。

对于非验证 ssl 连接,您可以使用sslfactory=org.postgresql.ssl.NonValidatingFactory

但请记住,一旦启用 SSL 验证,它可能需要根 CA 证书。

您有以下各种选择(可能并不详尽。但这些对我有用。)

  1. 您可以将其放在默认位置,即 ~/Postgres/root.crt 或
  2. PGSSLROOTCERT env 变量设置为其路径或
  3. 导入到信任库并将其路径传递为: -Djavax.net.ssl.trustStore=[trust_store_path] -Djavax.net.ssl.trustStorePassword=[trust_store_password]。如果您使用的是默认信任库,即 JRE 的 cacerts,则不需要这两个环境变量。

参考:

https://jdbc.postgresql.org/documentation/head/ssl-client.html

https://www.postgresql.org/docs/9.0/libpq-ssl.html

【讨论】:

    【解决方案3】:

    如果您不需要验证数据库客户端,只需在postgresql.conf 中注释掉ssl_ca_file

    ssl_ca_file - 受信任的证书颁发机构,检查客户端证书是否由受信任的证书颁发机构签名。

    您的数据库 URL 应如下所示:

    url=jdbc:postgresql://host:5432/db_name?ssl=true&sslmode=require
    

    有关sslmode的更多详细信息,请参阅PostgreSQL JDBC docs

    否则,如果您需要验证数据库客户端,则应在数据库 URL 中添加 sslcert=...sslkey=... 参数。

    【讨论】:

    • 嗨!如何使用 sslkey= ?我是否还需要 sslcert= 或使用密钥本身才能工作?
    • @AshutoshTiwari,会是这样的jdbc:postgresql://host:5432/db_name?sslmode=verify-full&amp;sslrootcert=CA.crt&amp;sslcert=db-client.crt&amp;sslkey=db-client.pk8
    【解决方案4】:

    我在 jfrog artifactory 连接到 azure postgres 时遇到了问题,这对我有用

    sudo cat <<EOF >/opt/jfrog/artifactory/var/etc/system.yaml
    configVersion: 1
    shared:
        node:
        database:
            type: postgresql
            driver: org.postgresql.Driver
            url: "jdbc:postgresql://test-psqlserver.postgres.database.azure.com:5432/postgres?ssl=true&sslmode=require"
            username: psqladminun@test-psqlserver
            password: password:-)
    EOF

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2011-05-18
      • 2020-10-27
      • 2017-10-15
      • 2013-10-03
      • 2017-03-19
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多