【发布时间】:2017-09-27 02:50:59
【问题描述】:
我正在使用 SpringBoot,配置 datasource.url = jdbc:postgresql://...../mydb?ssl=true&sslFactory=....nonValidating...
在我的 application.yml 中
port: 8443
ssl:
enabled: true
key-alias: PGSQLServerHostNameHere
key-store: keystore.jks
key-store-password:....
key-store-type: JKS
trust-store: #this one is irrelevant, it's just a...
### ... trust store for other restTemplate stuff
trust-store-password: ....
key-password: ....
ciphers: "TLSv1.2"
protocol: TLS
不过,Postgresql 也是在 SSL=on 的情况下设置和运行的。 ssl_ciphers='TLSv1.2'
但是在 PGSQL 日志中我得到:
Postgresql could not accept SSL connection: sslv3 alert certificate unknown
我在 prod 上的 Spring Boot 应用程序中遇到错误(我在本地的自签名证书不会发生此错误):
org.postgresql...PSQLException: SSL error: sun.security.validator.ValdiatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
SSL 证书配置
我在 root.crt 中有用于 postgresql 服务器的签名证书(包括 Java 应用服务器的签名证书,其中包含正确的别名)。
我在 JKS 文件中有 postgresql 服务器的签名证书(别名:PGSQLServerHostNameHere)作为我的 keystore.jks 的“trustEntry”。
我的 keystore.jks 中有 privateKeyEntry 用于我自己的服务器。
我在 keystore.jks 中有根 CA。
SpringBoot 应用在我的本地机器上运行良好,带有自签名 JKS。
但是 Postgresql 是个问题...拒绝我来自 java 应用服务器的通信。
postgresql.conf:
ssl = on
ssl_ciphers = 'TLSv1.2'
(everything else is default)
pg_hba.conf
hostssl all all md5
【问题讨论】:
-
"我的 keystore.jks 中有 privateKeyEntry 用于我自己的服务器。" the culprit。您确定客户端没有将证书作为客户端身份验证器发送,并且 postgres 服务器因为不处理客户端证书身份验证而阻塞?
-
@dhke 不确定(我不是 SSL 专家)。我有另一个网站的客户端 RestTemplate 东西,我只需要一个 trustStore。对于 java Spring Boot 连接到我自己的 PGSQL,我相信我需要一个私钥 + 签名证书(使用 openssl 创建 pkcs12 文件),然后使用私钥将 pkcs12 导入 keytool jks,然后是 PGSQL 的签名证书(使用 keytool 导入)进入我的 keystore.jks 文件。我不知道客户端身份验证的东西。
-
您拥有的 SSL 配置用于 HTTPS 部分,不用于其他任何内容 (afaik)。
-
@M.Deinum 你是说 SpringBoot 不会通过 -Djavax.net.ssl.keyStore=/path/to/keystore/keystore.jks 自动配置它吗?我还必须添加这些命令行选项吗?
-
这正是我要说的。这些 SSL 设置用于配置 servlet 容器的 HTTPS 连接器,而不是用于一般 SSL。因此,这些属性位于
server命名空间中。
标签: java postgresql ssl spring-boot