2016-07-31 7 views

答えて

0

私は反射を使って同じ問題を解決しました。 は、使用してソケットを接続しますsetSNIHostは次のように宣言されている

SSLSocketFactory sf = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
SSLSocket socket = (SSLSocket) sf.createSocket(uri.getHost(), 443); 
setSNIHost(sf, socket, uri.getHost()); 
SSLSession s = socket.getSession(); 

:私は反射のためのコードをコピーしたところ、私は本当に覚えていない

public void setSNIHost(final SSLSocketFactory factory, final SSLSocket socket, final String hostname) { 
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { 
     Log.i(TAG, "Setting SNI via SSLParameters"); 
     SNIHostName sniHostName = new SNIHostName(hostname); 
     SSLParameters sslParameters = socket.getSSLParameters(); 
     List<SNIServerName> sniHostNameList = new ArrayList<>(1); 
     sniHostNameList.add(sniHostName); 
     sslParameters.setServerNames(sniHostNameList); 
     socket.setSSLParameters(sslParameters); 
    } else if (factory instanceof android.net.SSLCertificateSocketFactory) { 
     Log.i(TAG, "Setting SNI via SSLCertificateSocketFactory"); 
     ((android.net.SSLCertificateSocketFactory)factory).setHostname(socket, hostname); 
    } else { 
     Log.i(TAG, "Setting SNI via reflection"); 
     try { 
      socket.getClass().getMethod("setHostname", String.class).invoke(socket, hostname); 
     } catch (Throwable e) { 
      Log.e(TAG, "Could not call SSLSocket#setHostname(String) method ", e); 
     } 
    } 
} 

は、私は単にAPI 24のサポートを追加しました。

関連する問題