【问题标题】:Certificate for <localhost> doesn't match any of the subject alternative names<localhost> 的证书与任何主题备用名称都不匹配
【发布时间】:2018-06-19 12:08:14
【问题描述】:

错误

javax.net.ssl.SSLException: Certificate for <localhost> doesn't match any of the subject alternative names: [xxxxxxx.xxx.xxxxxx.xxx]

我的 localhost 中有一个 Spring Boot 应用程序正在运行。我还有一条通过油灰到服务器的隧道ssh

我做过的事情:

  • 我手动创建/导入了各种方式的密钥/证书。
  • 我使用 keytool 中的 -ext 将 dns 地址和 localhost 添加到 SAN。
  • 我还使用了openSource java 文件来安装证书。
  • 我将 hosts 文件更改为:127.0.0.1 xxx.xxx.xxxxxxx.xxx(如果我 ping dns 名称,它会响应 localhost 地址)
  • 我使用 VM Arguments -Djavax.net.debug=ssl 检查证书是否正确加载。

我错过了什么?顺便说一句,我也在使用 VPN。

【问题讨论】:

    标签: spring-boot ssl-certificate


    【解决方案1】:

    您需要在创建证书时提供 localhost 作为主题替代名称。您可以通过提供以下附加参数来做到这一点:-ext "SAN:c=DNS:localhost,IP:127.0.0.1"

    所以是这样的:

    keytool -genkeypair -keyalg RSA -keysize 2048 -alias stackoverflow -dname "CN=stackoverflow,OU=Hakan,O=Hakan,C=NL" -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -validity 3650 -keystore identity.jks -storepass secret -keypass secret -deststoretype pkcs12
    

    一些解释:

    SAN 字段将用于匹配将在请求中提供的主机名。因此,当您在 localhost 上运行应用程序时,假设 https://localhost:443 并且您还想向该特定主机发出请求,该主机名也应该在 SAN 字段中可用,否则它将在握手过程中失败。

    让我们以 Stackoverflow 为例。为了能够通过 https 访问 stackoverflow,我们希望证书应该至少包含一个 stackoverflow.com 条目

    以下是 stackoverflow 的证书 SAN 值,并为此示例突出显示了特定的 DNS:

    如您所见,它还包含其他 dns 值。通过这种方式,网站所有者可以为多个网站/子域等使用相同的证书。

    【讨论】:

    • 为什么替代名称包含自己的 stackoverflow.com?
    • 它包含自己是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 2021-05-24
    • 2020-03-02
    • 1970-01-01
    • 2016-12-27
    • 2020-10-03
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多