0

我正在尝试使用以下属性创建 SSLSocket:

  1. 它应该进行 SSL 证书验证。
  2. 它应该允许设置自定义 SNI(服务器名称指示)。

据我了解:

  1. SSLCertificateSocketFactory.getDefault不允许您设置自定义 SNI,但会进行 SSL 证书验证。
  2. SSLCertificateSocketFactory.getInsecure确实允许您设置自定义 SNI,但不进行 SSL 证书验证。

因此,最好的解决方案可能是在使用SSLCertificateSocketFactory.getInsecure.

我正在使用以下代码设置自定义 SNI:

SSLCertificateSocketFactory ssf = (SSLCertificateSocketFactory) SSLCertificateSocketFactory
        .getInsecure(Utils.getConnectTimeOutForHost(m_host),
                null);
m_sslsocket = (SSLSocket) ssf.createSocket(m_socket, m_host,
        m_port, false);
m_sslsocket.setEnabledProtocols(m_sslsocket.getSupportedProtocols());

String hostName = getSNIHost();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    Log.i(TAG, "Setting SNI hostname");
    ssf.setHostname(m_sslsocket, hostName);
} else {
    try {
        java.lang.reflect.Method setHostnameMethod = m_sslsocket
                .getClass().getMethod("setHostname", String.class);
        setHostnameMethod.invoke(m_sslsocket, hostName);
    } catch (Exception e) {
        Log.w(TAG, "SNI not useable", e);
    }
}
4

0 回答 0