2016-07-31 6 views

ответ

0

У меня была та же проблема, решена с помощью отражения. Подключите разъем с помощью:

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

где setSNIHost объявлен как:

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.