类javax.net.ssl.SSLSocketFactory
定义了一个方法createSocket(Socket s, String host, int port, boolean autoClose)
,该方法返回SSLSocket
的一个实例。
我正在努力理解这个方法,所以我的问题是:为什么这个方法需要一个host参数?不应该从普通套接字的底层getInetAddress().getHostName()
读取主机吗?还是我遗漏了什么?
在SSLSocketFactoryImpl中实现后,它将返回新的SSLSocketImpl,在这里您可以看到以下代码片段
if (peerHost == null || peerHost.isEmpty()) {
boolean useNameService =
trustNameService && conContext.sslConfig.isClientMode;
useImplicitHost(useNameService);
} else {
conContext.sslConfig.serverNames =
Utilities.addToSNIServerNameList(
conContext.sslConfig.serverNames, peerHost);
}
(注意peerHost与主机参数相同(
因此,我认为这里的重点是,如果你不提供主机名,那么查找主机名需要付出更多的努力——你可以按照useImplicitHost(useNameService)
查看其中的逻辑,以防主机缺少