Spring Boot 的证书< localhost>与任何使用者备用名称都不匹配

b5lpy0ml  于 2022-11-23  发布在  Spring
关注(0)|答案(1)|浏览(182)

错误

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

我有一个Sping Boot 应用程序在我的X1 M0 N1 X中运行。我还有一个通过putty到服务器的隧道X1 M1 N1 X。
我做过的事情:

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

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

mm5n2pyu

mm5n2pyu1#

创建证书时需要提供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 \
-storepass <password> -keypass <password> \
-keystore identity.jks -deststoretype pkcs12

一些解释:

SAN字段将用于匹配主机名,主机名将在请求中提供。因此,当您在localhost上运行应用程序时,比如说https://localhost:443,并且您还希望向该特定主机发出请求,则该主机名也应在SAN字段中可用;否则,它将在握手过程中失败。
让我们以Stackoverflow为例。
下面是stackoverflow的证书SAN值,其中突出显示了本示例中的特定DNS:

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

相关问题