0

次のプロパティで SSLSocket を作成しようとしています。

  1. SSL証明書の検証を行う必要があります。
  2. カスタム SNI (サーバー名表示) を設定できるようにする必要があります。

私が理解したことから:

  1. SSLCertificateSocketFactory.getDefaultカスタム SNI を設定することはできませんが、SSL 証明書の検証は行います。
  2. 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);
    }
}
4

0 に答える 0