javax.net.ssl.SSLPeerUnverifiedException: Hostname not verified:

2022-09-01 23:23:56

我正在尝试使用自签名证书的连接。
我已按照此处所述的创建自签名证书的步骤操作 - 创建自签名证书
即使在浏览器中,一切正常,它也只向我显示一条消息,指出我的证书是由未知 CA 签名的。
但是我在证书中的 FQDN(服务器名称不匹配)名称有问题,因为我在生成证书时设置了不正确的名称。
我已经重新生成了它,现在没有这样的错误。HTTPS

我需要从移动Android客户端使用我的服务器sertificate,我找到了关于这个问题的很棒的文章 - 在Android中使用自签名或未知SSL证书的改造。我已经遵循了所有步骤,但不幸的是得到一个错误(异常)。

javax.net.ssl.SSLPeerUnverifiedException: Hostname 195.xx.xx.xx not verified:
    certificate: sha1/qvH7lFeijE/ZXxNHI0B/M+AU/aA=
    DN: 1.2.840.113549.1.9.1=#160e63726f73704078616b65702e7275,CN=195.xx.xx.xx,OU=Departament of Development,O=CROSP Solutions,L=Chernihiv,ST=Chernihiv,C=UA
    subjectAltNames: []
            at com.squareup.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:124)

如您所见,主机名是相同的,但错误仍然存在。
请帮助处理这个问题,我会感谢任何帮助。
谢谢。

伪解决方案

当然,我之前搜索过并找到了HostName Verifier Solution
我试过了,它有效。但是可以使用此解决方法吗,我将证书添加到我的应用程序中,以便像前面的示例一样动态读取它,在这种情况下是否仍在使用它。

使用OkHttp的解决方案是一行。(如果您按照教程中的所有步骤操作)。

 okHttpClient.setHostnameVerifier(new NullHostNameVerifier());

但我仍然觉得这不是最好的解决方案,请您有任何想法吗?


答案 1

有趣的是,如果请求主机是一个IP,则不使用“CN”来匹配它;相反

https://www.rfc-editor.org/rfc/rfc2818#section-3.1

iPAddress 使用者AltName 必须存在于证书中,并且必须与 URI 中的 IP 完全匹配”

如果你使用java的keytool,它可以通过以下方式完成

keytool -genkeypair  -ext SAN=IP:195.xx.xx.xx    ........

NullHostNameVerifier对于您的用例也是可以的。您的客户端只信任一个证书;只要连接使用该证书,您就是安全的;主机名在这里无关紧要。


答案 2

自签名证书非常适合开发。你不能使用它,因为你知道它未经验证,如果没有CA的批准,应用程序和浏览器不会信任你。

因此,这不是您的实时应用程序的“解决方案”,而只是为了测试它是否有效(并且将在您获得证书时使用有效的证书)。因为你允许所有主机名(或者至少是硬编码的主机名,如果你把它限制为几个),而且两者都不好。

您是否也计划在实时应用程序中使用自签名证书?