【问题标题】:Unable to validate client certificate with Akka HTTP server (Play Framework)无法使用 Akka HTTP 服务器(Play 框架)验证客户端证书
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2014-09-05
      相关资源
      最近更新 更多