如何在Java中对自定义协议进行主机名验证?

问题描述 投票:0回答:1

我们在套接字上使用自定义协议。对于 TLS,我们不能使用

setEndpointIdentificationAlgorithm()
,因为它的参数可以是 HTTPS 或 LDAPS 。

自定义协议如何进行主机名验证? 我们是否需要通过重写

HostnameVerifier
方法来使用
verify()
类?如果是这样,我们如何从自定义协议 URL 中获取主机名?

java ssl
1个回答
0
投票

如果您使用自定义的非 HTTP 基础协议,我想最终您将建立一个

javax.net.ssl.SSLSocket
连接。 SSLSocket 有 getSSLSession(),它为您提供一个 SSLSession,可以查询它以获取有关 SSL/TLS 连接的各种详细信息。

SSLSession 正是 HostnameVerifer 验证主机所需的。因此,您应该能够使用

HttpsURLConnection.getDefaultHostnameVerifier()
获取默认验证程序实例,并可以使用它来验证用于建立连接的主机名是否与服务器证书匹配。

因此,在建立 SSLSocket 连接后,应该可以通过这种方式验证主机名(代码未测试):

String hostname = "example.org";
SSLSocket socket = ... // establish SSLSocket to <hostname>

HostnameVerifier verifier = HttpsURLConnection.getDefaultHostnameVerifier();
verifier.verify(hostname, socket.getSession());
© www.soinside.com 2019 - 2024. All rights reserved.