Как включить поддержку TLS 1.2 в приложении Android (работающем на Android 4.1 JB)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как включить поддержку TLS 1.2 в приложении Android (работающем на Android 4.1 JB)

Сообщение Anonymous »

Согласно документации Android для SSLSocket и SSLContext, протоколы TLS v1.1 и v1.2 поддерживаются на уровне API 16+, но не включены по умолчанию.
http://developer.android.com/reference/ ... ocket.html
http://developer.android.com/reference/ ... ntext.html
Как включить его на устройстве под управлением Android 4.1 или более поздней версии (но ниже 5.0)?
Я попробовал создать собственный SSLSocketFactory, который включает все поддерживаемые протоколы. при создании Socket и позже использовать мою собственную реализацию как:

HttpsURLConnection.setDefaultSSLSocketFactory(new MySSLSocketFactory());

Код: Выделить всё

public class MySSLSocketFactory extends SSLSocketFactory {

private SSLContext sc;
private SSLSocketFactory ssf;

public MySSLSocketFactory() {
try {
sc = SSLContext.getInstance("TLS");
sc.init(null, null, null);
ssf = sc.getSocketFactory();

} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}

@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose)
throws IOException {
SSLSocket ss = (SSLSocket) ssf.createSocket(s, host, port, autoClose);
ss.setEnabledProtocols(ss.getSupportedProtocols());
ss.setEnabledCipherSuites(ss.getSupportedCipherSuites());
return ss;
}

@Override
public String[] getDefaultCipherSuites() {
return ssf.getDefaultCipherSuites();
}

@Override
public String[] getSupportedCipherSuites() {
return ssf.getSupportedCipherSuites();
}

@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
SSLSocket ss = (SSLSocket) ssf.createSocket(host, port);
ss.setEnabledProtocols(ss.getSupportedProtocols());
ss.setEnabledCipherSuites(ss.getSupportedCipherSuites());
return ss;
}

@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
SSLSocket ss = (SSLSocket) ssf.createSocket(host, port);
ss.setEnabledProtocols(ss.getSupportedProtocols());
ss.setEnabledCipherSuites(ss.getSupportedCipherSuites());
return ss;
}

@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort)
throws IOException, UnknownHostException {
SSLSocket ss = (SSLSocket) ssf.createSocket(host, port, localHost, localPort);
ss.setEnabledProtocols(ss.getSupportedProtocols());
ss.setEnabledCipherSuites(ss.getSupportedCipherSuites());
return ss;
}

@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress,
int localPort) throws IOException {
SSLSocket ss = (SSLSocket) ssf.createSocket(address, port, localAddress, localPort);
ss.setEnabledProtocols(ss.getSupportedProtocols());
ss.setEnabledCipherSuites(ss.getSupportedCipherSuites());
return ss;
}
}
Но он по-прежнему выдает исключение при попытке установить соединение с сервером, на котором включен Только TLS 1.2.
Вот исключение, которое я получаю:

03-09 09:21:38.427: W/System.err(2496):
javax .net.ssl.SSLHandshakeException:
javax.net.ssl.SSLProtocolException: SSL-квитирование прервано:
ssl=0xb7fa0620: сбой в библиотеке SSL, обычно ошибка протокола
03-09 09:21:38.427: W/System.err(2496): ошибка:14077410:SSL
процедуры:SSL23_GET_SERVER_HELLO: ошибка установления связи с предупреждением sslv3
(external/openssl/ssl/s23_clnt.c :741 0xa90e6990:0x00000000)


Подробнее здесь: https://stackoverflow.com/questions/289 ... ndroid-4-1
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»