在 Play Framework java 应用程序中获取 CertificateException: "No name matching localhost found"

Gettig CertificateException: "No name matching localhost found" in Playframework java application

我有 2 个应用程序,一个应用程序在 Spring Boot 中,另一个在 Playframework 中。我正在尝试在 Playframework 应用程序中使用 Spring Boot 应用程序的 REST 端点。我正在使用我获得的证书访问 REST 端点。在我的播放应用程序中,我禁用了主机名验证,但我仍然收到此错误。您可以在下面找到代码和配置:

AsyncHttpClient-2-1, fatal error: 46: General SSLEngine problem
java.security.cert.CertificateException: No name matching localhost found

Spring 引导应用程序配置

application.properties

server.port=8085
server.ssl.key-alias=demo
server.ssl.key-password=changeit
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS
server.ssl.key-store=server.jks

Playframework 应用程序配置

application.conf

play.ws.ssl.loose.acceptAnyCertificate = false
play.ws.ssl.loose.disableHostnameVerification = true

play.ws.ssl {
  trustManager = {
    stores = [
      { type = "PEM", path = "public.crt" }
    ]
  }
}

play.ws.ssl.debug = {
    all = false
    ssl = true
    certpath = true
}

如果我设置 play.ws.ssl.loose.acceptAnyCertificate = true 那么它就可以工作了。我想将其保持为假,然后访问终点。

我觉得我的配置有问题,这就是为什么只添加了配置。如果需要更多信息,我也会添加代码片段。

这是一个密钥库问题,您的客户端配置方式是根据密钥库中的元数据检查使用的主机名。 因此,您必须将 "Subject" CN 设置为 "localhost",或者在主机名中添加带有 "localhost" 的主题备用名称。

我最喜欢 https://keystore-explorer.org/ 创建密钥库的工具,添加 SAN 很容易。 Java 的 keytool 可以做同样的事情,尽管使用“-ext san=dns:www.example.com”