java - 属性 quarkus.http.ssl.certificate.key-store-file 无法使用无法找到请求目标的有效证书路径
问题描述
我的 Quarkus 应用程序必须连接到一些我必须使用自定义密钥库的 HTTPS 资源。
我已按照本指南使用自定义 jks 配置 SSL:https ://quarkus.io/guides/http-reference#supporting-secure-connections-with-ssl
因此,我向我的应用程序添加了两个属性,包括密钥库文件系统位置及其密码:
quarkus.http.ssl.certificate.key-store-file=/tmp/quarkus/keystore.jks
quarkus.http.ssl.certificate.key-store-password=mypassword
在启动时我看到这个异常:
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:439)
at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306)
at java.base/sun.security.validator.Validator.validate(Validator.java:264)
at java.base/sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:313)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:276)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:141)
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:623)
... 32 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:434)
... 38 more
2020-03-20 10:39:04,089 INFO [io.qua.dev] (vert.x-worker-thread-1) Hot replace total time: 0.372s
如果我使用 ssl debug ( ./mvnw clean compile quarkus:dev -Djavax.net.debug=all
) 启动应用程序,我看不到我的密钥库(只有 JDK 的 cacerts):
javax.net.ssl|DEBUG|01|main|2020-03-20 10:38:13.910 CET|TrustStoreManager.java:161|Inaccessible trust store: /Users/myuser/.sdkman/candidates/java/11.0.6.hs-adpt/lib/security/jssecacerts
javax.net.ssl|DEBUG|01|main|2020-03-20 10:38:13.911 CET|TrustStoreManager.java:112|trustStore is: /Users/myuser/.sdkman/candidates/java/11.0.6.hs-adpt/lib/security/cacerts
trustStore type is: pkcs12
trustStore provider is:
the last modified time is: Wed Jan 15 13:06:55 CET 2020
javax.net.ssl|DEBUG|01|main|2020-03-20 10:38:13.911 CET|TrustStoreManager.java:311|Reload the trust store
但是,如果我使用通常的信任库 JVM 参数启动它,我可以看到它并且应用程序可以工作:
./mvnw clean compile quarkus:dev -Djavax.net.ssl.trustStore=/Users/myuser/development/keystore.jks -Djavax.net.ssl.trustStorePassword=mypassword -Djavax.net.debug=all
javax.net.ssl|DEBUG|01|main|2020-03-20 10:49:08.812 CET|TrustStoreManager.java:112|trustStore is: /tmp/quarkus/keystore.jks
trustStore type is: pkcs12
trustStore provider is:
the last modified time is: Fri Mar 20 10:07:16 CET 2020
javax.net.ssl|DEBUG|01|main|2020-03-20 10:49:08.812 CET|TrustStoreManager.java:311|Reload the trust store
但是我希望它与quarkus.http.ssl.certificate
参数一起使用。
这可能是一个错误还是我错过了什么?
解决方案
如果我正确理解了这个问题,您的 Quarkus 应用程序是一个使用 HTTPS 连接到某个服务器的客户端。
在这种情况下,您真正需要的是提供用于验证您的应用程序尝试连接的服务器的证书。这就是当您使用 javax.net.ssl.* 参数提供信任库时它起作用的原因。
您在 Quarkus 文档中提到的指南是关于使用 SSL 公开服务器的。因此,在这种情况下,您需要提供密钥库。我不知道 Quarkus 本身是否支持使用特定属性提供信任库。但是,根据您的应用程序连接到 HTTPS 服务器的方式,您可以尝试在那里进行配置。
推荐阅读
- terraform - Terraform 从 v0.11 迁移到 v0.12 的标签问题
- java - 具有非主键和不同名称的列的休眠文件 XML 连接表
- reactjs - 如何在 React-admin 中清除注销历史记录?
- python-3.x - NLP 句子分割比 Python 算法有什么好处?
- java - javax.net.ssl.SSLException:写入错误:ssl=0x7230272908:系统调用期间的 I/O 错误,将值发布到服务器期间管道损坏
- mysql - 计算所有过滤字段组合
- javascript - Javascript十进制问题
- android - 使用 jmrtd 在 Android(java) 中的 ePassport 被动身份验证
- r - 如何使用循环对数据进行排序?
- performance - Kusto 查询,选择 5 分钟的间隔并计算平均值