Java 如何调用sslSocket.setHostname()?

Java 如何调用sslSocket.setHostname()?,java,android,ssl,sni,Java,Android,Ssl,Sni,我的目标: SSLv3显式禁用-意味着覆盖工厂类上已启用协议的列表 启用SNI-意味着在握手之前调用套接字上的setHostname 伪码 SSLCertificateSocketFactory factory = SSLCertificateSocketFactory.getDefault(timeout); // set keystore and truststore, etc. httpsURLConnection.setSSLSocketFactory(factory); 换句话说,我

我的目标:

  • SSLv3显式禁用-意味着覆盖工厂类上已启用协议的列表
  • 启用SNI-意味着在握手之前调用套接字上的setHostname
  • 伪码

    SSLCertificateSocketFactory factory = SSLCertificateSocketFactory.getDefault(timeout);
    // set keystore and truststore, etc.
    httpsURLConnection.setSSLSocketFactory(factory);
    
    换句话说,我甚至看不到插座


    假设SSLCertificateSocketFactory没有任何公共构造函数,HttpsURLConnection上的setter需要工厂类(而不是接口)我不知道如何在工厂和连接之间进行拦截,以便调用setHostname…

    您可以编写
    SSLCertificateSocketFactory
    的子类,以提供所需的构造函数。@Michael不幸的是,SSLCertificateSocketFactory没有非私有构造函数。您可以传递
    SSLCertificateSocketFactory
    实例作为派生类构造函数的参数。@Michael您的新构造函数将无法调用任何超级构造函数,因此它将无法编译:(啊,没错。虽然
    SSLCertificateSocketFactory(int handshakeTimeoutMillis)
    仍然是公开的,但它只是被标记为不推荐使用。另一种选择是获取
    SSLCertificateSocketFactory
    的源代码,并基于它实现您自己的版本。