次のプロパティで SSLSocket を作成しようとしています。
- SSL証明書の検証を行う必要があります。
- カスタム SNI (サーバー名表示) を設定できるようにする必要があります。
私が理解したことから:
SSLCertificateSocketFactory.getDefault
カスタム SNI を設定することはできませんが、SSL 証明書の検証は行います。SSLCertificateSocketFactory.getInsecure
カスタム SNI を設定できますが、SSL 証明書の検証は行いません。
したがって、最善の解決策は、.xml を使用して作成された SSLSocket で 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);
}
}