我正在尝试使用以下属性创建 SSLSocket:
- 它应该进行 SSL 证书验证。
- 它应该允许设置自定义 SNI(服务器名称指示)。
据我了解:
SSLCertificateSocketFactory.getDefault
不允许您设置自定义 SNI,但会进行 SSL 证书验证。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);
}
}