<localhost>的证书与任何主题备用名称都不匹配

23

错误信息:

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

我有一个运行在本地计算机的Spring Boot应用程序。我也通过putty建立了一个ssh隧道到服务器。

我已经完成以下步骤:

  • 我手动创建/导入了所有方式的密钥/证书。
  • 我使用-keytool中的-ext选项将dns地址和localhost添加到SAN中。
  • 我还使用了一个开源的Java文件来安装证书。
  • 我更改了hosts文件以将其设置为: 127.0.0.1 xxx.xxx.xxxxxxx.xxx(如果我ping DNS名称,则响应本地主机地址)。
  • 我使用VM参数-Djavax.net.debug=ssl来检查证书是否正确加载。

我还需要什么?顺便说一下,我还在使用VPN。

1个回答

46

在创建您的证书时,您需要将本地主机名作为替代名称提供。您可以通过提供以下附加参数来实现:-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 \
-storepass <password> -keypass <password> \
-keystore identity.jks -deststoretype pkcs12

一些解释:

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

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

下面是stackoverflow的证书SAN值,其中针对此示例突出显示了特定的DNS: Stackoverflow certificate san values

正如您已经看到的那样,它还包含其他DNS值。通过这种方式,网站所有者可以为多个网站/子域使用相同的证书等。


为什么alternative names包含自身stackoverflow.com? - eastwater
它包含自身是什么意思? - Hakan54

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接