Authentication 无法使用Akka HTTP服务器(Play Framework)验证客户端证书

Authentication 无法使用Akka HTTP服务器(Play Framework)验证客户端证书,authentication,https,playframework,certificate,akka,Authentication,Https,Playframework,Certificate,Akka,我正在尝试使用Play框架(2.7)设置一个具有客户端证书身份验证的HTTPS服务器。但是客户端身份验证总是失败,因为无法找到到请求目标的有效认证路径 客户端证书由使用自签名证书的自定义证书颁发机构签名。在我的设置中,此自定义CA是服务器应信任的唯一CA 在application.conf中,我添加了以下配置来设置HTTPS服务器,并用自定义CA证书替换默认的信任存储 play { server { https { keyStore { path = "/

我正在尝试使用Play框架(2.7)设置一个具有客户端证书身份验证的HTTPS服务器。但是客户端身份验证总是失败,因为
无法找到到请求目标的有效认证路径

客户端证书由使用自签名证书的自定义证书颁发机构签名。在我的设置中,此自定义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

必须设置自定义SSL引擎提供程序,请参阅,因为
defaultsLengineProvider
仅支持
play.server.https.trustStore.noAveration=(true | false)
,并回退到默认JVM信任存储

不要与一些日志消息混淆,最好调试应用程序。CA已加载,但已加载到所需的其他SSL上下文

我遇到了稍有不同的问题,最终覆盖了JVM cacerts,因为Play config没有提供我需要的配置