【问题标题】:What is the difference between `ssl` and `useSSL` in jdbc Postgres driver?jdbc Postgres驱动程序中的`ssl`和`useSSL`有什么区别?
【发布时间】:2018-08-29 16:41:45
【问题描述】:

我正在尝试设置一个掌舵图,其中使用 SSL 是您传递给连接字符串以运行迁移的参数,并且在理解 jdbc postgres 连接字符串的 ssluseSSL 参数时遇到问题。

jdbc SSL 客户端的文档:https://jdbc.postgresql.org/documentation/91/ssl-client.html(谈论ssl 标志)

我的命令如下:

command:
- mvn
- process-resources
- -PdbUpdate
- -Ddb.url=jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?loginTimeout=1&ssl=VARIABLE
- -Ddb.username=${DATABASE_USERNAME}
- -Ddb.password=${DATABASE_PASSWORD}
- -Dliquibase.contexts=prod

非 SSL 连接

如果我将我的连接字符串 ssl=false 传递给没有 SSL 的 postgres 数据库,我会收到以下错误:

[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.5.1:update (dbUpdate) on project exchange-api-metadata-db-migrations:\
Error setting up or running Liquibase: liquibase.exception.DatabaseException: org.postgresql.util.PSQLException: The connection attempt failed. sun.security.validator.ValidatorException: PKIX path building failed:\
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target -> [Help 1]

它似乎正在尝试查找证书,但如果 sslfalse,则不确定为什么要这样做。

连接字符串:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?loginTimeout=1&ssl=false

如果我不使用ssl=false,而是使用useSSL=true,那么它可以工作。


SSL 连接

如果我对同一命令使用useSSL=true,那么

[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.5.1:update (dbUpdate) on project exchange-api-metadata-db-migrations:\
Error setting up or running Liquibase: liquibase.exception.DatabaseException: org.postgresql.util.PSQLException:\
FATAL: no pg_hba.conf entry for host "10.244.83.14", user "stolon", database "exchange-api-metadata-db", SSL off -> [Help 1]

基本上,它似乎仍然没有真正使用 SSL 进行连接。

连接字符串:jdbc:postgresql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?loginTimeout=1&useSSL=true

如果我不使用useSSL=true,而是使用ssl=true,那么它可以工作。


jdbc postgresql驱动中ssluseSSL有什么区别? (我在useSSL 上找不到任何文档) 我应该总是通过两个标志吗?如果我只想使用一个模板变量,同时传递两个标志会不会有问题?

我目前的猜测是ssl 用于尝试在系统中查找证书,useSSL 用于通过安全端口而不是默认端口连接到数据库。

【问题讨论】:

    标签: java postgresql maven ssl liquibase


    【解决方案1】:
    1. 请按照您的要求说明 pgjdbc 版本。我建议将 pgjdbc 升级到当前版本(例如升级到 42.2.2)
    2. useSSL 从未被视为连接参数。这个属性基本上被忽略了
    3. sslmode 属性可能会让您的运气更好(请参阅https://jdbc.postgresql.org/documentation/head/connect.html)。它取代了ssl 属性,并为您配置连接的方式提供了灵活性

      sslmode可能的值包括disablerequireverify-caverify-fullallowprefer

    4. 相关代码为https://github.com/pgjdbc/pgjdbc/blob/REL42.2.2/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java#L98

    5. 您也可以从https://github.com/pgjdbc/pgjdbc/blob/REL42.2.2/pgjdbc/src/test/java/org/postgresql/test/ssl/SslTest.java#L67 获得灵感

    【讨论】:

    • 不知道为什么这被否决了,因为它是正确的。只是添加到这个ssl=false 实际上启用了 SSL,因为ssl 参数 ["Control[s] 使用 SSL (任何非空值都会导致需要 SSL"](github.com/pgjdbc/pgjdbc/blob/REL42.2.2/pgjdbc/src/main/java/… ). 基本上useSSL=true/false 什么都不做,ssl=truessl=false 打开 SSL,因为它不是空/空,而不是它所代表的布尔文本值。它可能有点违反直觉......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多