Java SSL 套接字在现有套接字 SSLSocketFactory 上分层:它是不是需要主机参数?

Posted

技术标签:

【中文标题】Java SSL 套接字在现有套接字 SSLSocketFactory 上分层:它是不是需要主机参数?【英文标题】:Java SSL socket layered over existing socket SSLSocketFactory: does it require a host parameter?Java SSL 套接字在现有套接字 SSLSocketFactory 上分层:它是否需要主机参数? 【发布时间】:2021-09-10 11:46:35 【问题描述】:

javax.net.ssl.SSLSocketFactory定义了一个方法createSocket​(Socket s, String host, int port, boolean autoClose),它返回一个SSLSocket的实例。

我试图理解这个方法,所以我的问题是:为什么这个方法需要一个主机参数?不应该从普通套接字的底层getInetAddress().getHostName() 读取主机,还是我遗漏了什么?

【问题讨论】:

【参考方案1】:

跟随SSLSocketFactoryImpl中的实现,它会返回新的SSLSocketImpl,在这里你可以看到下面的sn-p代码

        if (peerHost == null || peerHost.isEmpty()) 
            boolean useNameService =
                    trustNameService && conContext.sslConfig.isClientMode;
            useImplicitHost(useNameService);
         else 
            conContext.sslConfig.serverNames =
                    Utilities.addToSNIServerNameList(
                            conContext.sslConfig.serverNames, peerHost);
        

(注意peerHost与host参数相同)

所以我认为这里的重点是,如果您不提供主机名,则需要花费更多的精力来查找以获取主机名 - 您可以关注 useImplicitHost(useNameService) 以查看其中的逻辑万一主人失踪了

【讨论】:

以上是关于Java SSL 套接字在现有套接字 SSLSocketFactory 上分层:它是不是需要主机参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PEM 文件在 Java 中创建 SSL 套接字?

java连接本地数据库 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。

为 SSL 套接字启用哪些密码套件?

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

详解:驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server 建立安全连接。

如何在 Oracle 11g 监听器中启用 SSL