错误:
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。
1条答案
按热度按时间mm5n2pyu1#
创建证书时需要提供localhost作为主题备用名称。可以通过提供以下附加参数来实现此目的:
-ext "SAN:c=DNS:localhost,IP:127.0.0.1"
所以是这样的:
一些解释:
SAN字段将用于匹配主机名,主机名将在请求中提供。因此,当您在localhost上运行应用程序时,比如说
https://localhost:443
,并且您还希望向该特定主机发出请求,则该主机名也应在SAN字段中可用;否则,它将在握手过程中失败。让我们以Stackoverflow为例。
下面是stackoverflow的证书SAN值,其中突出显示了本示例中的特定DNS:
正如你已经看到的,它还包含其他DNS值。这样网站所有者可以使用相同的证书为多个网站/子域等。