【发布时间】:2019-08-24 22:58:51
【问题描述】:
我正在尝试使用 Play Framework (2.7) 设置具有客户端证书身份验证的 HTTPS 服务器。但是客户端身份验证总是以unable to find valid certification path to requested target 失败。
客户端证书由使用自签名证书的自定义证书颁发机构签名。在我的设置中,这个自定义 CA 是服务器应该信任的唯一 CA。
在application.conf 中,我添加了以下配置来设置 HTTPS 服务器并将默认信任库替换为自定义 CA 证书。
play {
server {
https {
keyStore {
path = "/path/to/store",
password = "password",
type = "PKCS12"
}
needClientAuth = true
}
}
}
ssl-config {
trustManager = {
stores = [
{ type = "PEM", path = "path/to/ca/certificate" }
]
}
}
启用调试后,当应用程序初始化时,我看到自定义 CA 证书已加载:
adding as trusted cert:
Subject: EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
Issuer: EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
Valid from Wed Jul 06 15:38:40 CEST 2005 until Tue Jul 01 15:38:40 CEST 2025
但是,我还在日志中进一步看到以下几行:
trustStore is: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts
trustStore type is : jks
trustStore provider is :
init truststore
我没想到也不希望服务器使用默认的 JRE 信任库。我怎样才能完全禁用它?
无论如何,这不应该阻止服务器正确验证客户端 - 除非信任存储被完全覆盖(我希望不是这种情况,但到目前为止我还没有证明)。
当客户端连接时,我在日志中看到它的证书被正确读取:
chain [0] = [
Subject: EMAILADDRESS=devnull@mydomain.com, CN=My User, OU="User#41183", O=MyOrg, C=FR
Validity: [From: Thu Jan 11 10:17:12 CET 2018, To: Tue Jan 10 10:17:12 CET 2023]
Issuer: EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
]
chain [1] = [
Subject: EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
Validity: [From: Wed Jul 06 15:38:40 CEST 2005, To: Tue Jul 01 15:38:40 CEST 2025]
Issuer: EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
]
客户端颁发者与之前加载的自定义 CA 证书相匹配。但是,会引发以下错误:
application-akka.actor.default-dispatcher-2, fatal error: 46: General SSLEngine problem
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我错过了什么或我做错了什么?
编辑:我注意到如果我将自定义 CA 证书导入默认信任库,则身份验证正在工作。
编辑 2:似乎与 SSL 引擎提供程序的默认实现相关联:
2019-04-08 13:21:46 +0200 [DEBUG] from play.core.server.ssl.DefaultSSLEngineProvider in application-akka.actor.default-dispatcher-3 - Using default trust store for client side CA verification
【问题讨论】:
标签: authentication https playframework certificate akka