Android 4 시스템 터미널의 TLS11&1.2 대응
각 버전의 대응 상황
Android의 각 버전에서 TLS는 다음과 같습니다.
※Template: 웹 브라우저의 TLS/SSL 상태 변경
5.0 이후에는 "TLS/SSL의 기본 구성 수정"에 기재된 대로 기본적으로 유효합니다.
Android4.0.4 미만은 지원되지 않지만 4.1-4.4는 규정에 무효입니다.이 글은 어떻게 효과적으로 하는지를 소개할 것이다.
참조: SSLSocket:Default configuration for different Android versions
구글 플레이 서비스를 통한 보안 공급자 업데이트
관영 "취약한 공격으로부터 SSL 보호를 위한 보안 공급자 업데이트"에서 말한 바와 같이
구글 플레이 서비스 사용 시 애플류나 액티비티 등을 통해ProviderInstaller.installIfNeeded(context);
이렇게 실행하면 보안 공급자를 업데이트할 수 있습니다.(최대 350ms(비동기식)
업데이트를 진행하면 SSL SocketFactory가 최신으로 바뀌며 새 프로토콜은 기본적으로 적용됩니다.
참조: https://github.com/square/okhttp/issues/1934
이 대응은 Google Play 서비스가 필요합니다. 터미널이 없어도 지원하려면 다음과 같은 방법으로 대응할 수 있습니다.
명확하고 효과적인 SSL Socket Factory 확장
명시적으로 TLS를 유효하게 만드는 SSL Socket, TLS1을 사용합니다.1, 1.2도 사용할 수 있습니다.
참조: https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/
SSL Socket Factory, TLS1을 상속합니다.1、TLS1.클래스를 만듭니다. 2를 사용한 것 이외에 원시 처리로 돌아갑니다.public class TLSSocketFactory extends SSLSocketFactory {
private SSLSocketFactory internalSSLSocketFactory;
public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
internalSSLSocketFactory = context.getSocketFactory();
}
@Override
public String[] getDefaultCipherSuites() {
return internalSSLSocketFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return internalSSLSocketFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket() throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
}
private Socket enableTLSOnSocket(Socket socket) {
if(socket != null && (socket instanceof SSLSocket)) {
((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
}
return socket;
}
}
OkHttpCelient에 기록된 TLSSSocketFactory를 사용합니다.sslSocketFactory 설명
Most applications should not call this method, and instead use the system defaults. Those classes include special optimizations that can be lost if the implementations are decorated.
따라서 아래 코드는 4.4 이전에만 적용된다.
※ minSDK는 16개 전제 지점입니다.OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
// 4.4.4以前のみで作成したsslSocketFactoryを使うようにする
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
try {
okHttpClientBuilder
.connectionSpecs(Collections.singletonList(new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS).build()))
.sslSocketFactory(new TLSSocketFactory(), getTrustManager());
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
throw new RuntimeException(e);
}
}
// その他の設定
okHttpClientBuilder
.addInterceptor(new HttpLoggingInterceptor().setLevel(getLogLevel()));
OkHttpClient okHttpClient = okHttpClientBuilder.build();
이때sslSocketFactory(SSLSocketFactory sslSocketFactory)
deprecated니까.sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager)
, X509 TrustManager가 필요하지만 sslSocketFactory 설명에 기재된 기술을 통해 얻을 수 있습니다.private X509TrustManager getTrustManager() throws NoSuchAlgorithmException, KeyStoreException {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
}
return (X509TrustManager) trustManagers[0];
}
참조: https://github.com/square/okhttp/issues/2372
WebView 정보
Google이 패치를 제공하지 않은 4.3 미만의 WebView(WebKit)에 대해서는 대응할 수 없으며 4.4 이후의 WebView(Chromium)로 한정해야 합니다.
보충으로 5.0 이후의 웹뷰는 구글플레이에서 업데이트됐지만 4.4의 웹뷰는 크롬의 물건의 OS 동단이기 때문에 제조공장 업데이트 상황에 따라 다를 수 있다.
4.4 Chrome의 기본 버전은 30.0, TLS1입니다.2 대응하는 것이지만 앞으로 업데이트하지 말고 주의하는 것이 좋습니다.
참조: WebView for Android : What version of Chrome is it based on?
결론
minSDK21을 원해요!
Reference
이 문제에 관하여(Android 4 시스템 터미널의 TLS11&1.2 대응), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ntsk/items/9f31fc7b44c04ea45e0b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
관영 "취약한 공격으로부터 SSL 보호를 위한 보안 공급자 업데이트"에서 말한 바와 같이
구글 플레이 서비스 사용 시 애플류나 액티비티 등을 통해
ProviderInstaller.installIfNeeded(context);
이렇게 실행하면 보안 공급자를 업데이트할 수 있습니다.(최대 350ms(비동기식)업데이트를 진행하면 SSL SocketFactory가 최신으로 바뀌며 새 프로토콜은 기본적으로 적용됩니다.
참조: https://github.com/square/okhttp/issues/1934
이 대응은 Google Play 서비스가 필요합니다. 터미널이 없어도 지원하려면 다음과 같은 방법으로 대응할 수 있습니다.
명확하고 효과적인 SSL Socket Factory 확장
명시적으로 TLS를 유효하게 만드는 SSL Socket, TLS1을 사용합니다.1, 1.2도 사용할 수 있습니다.
참조: https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/
SSL Socket Factory, TLS1을 상속합니다.1、TLS1.클래스를 만듭니다. 2를 사용한 것 이외에 원시 처리로 돌아갑니다.public class TLSSocketFactory extends SSLSocketFactory {
private SSLSocketFactory internalSSLSocketFactory;
public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
internalSSLSocketFactory = context.getSocketFactory();
}
@Override
public String[] getDefaultCipherSuites() {
return internalSSLSocketFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return internalSSLSocketFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket() throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
}
private Socket enableTLSOnSocket(Socket socket) {
if(socket != null && (socket instanceof SSLSocket)) {
((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
}
return socket;
}
}
OkHttpCelient에 기록된 TLSSSocketFactory를 사용합니다.sslSocketFactory 설명
Most applications should not call this method, and instead use the system defaults. Those classes include special optimizations that can be lost if the implementations are decorated.
따라서 아래 코드는 4.4 이전에만 적용된다.
※ minSDK는 16개 전제 지점입니다.OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
// 4.4.4以前のみで作成したsslSocketFactoryを使うようにする
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
try {
okHttpClientBuilder
.connectionSpecs(Collections.singletonList(new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS).build()))
.sslSocketFactory(new TLSSocketFactory(), getTrustManager());
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
throw new RuntimeException(e);
}
}
// その他の設定
okHttpClientBuilder
.addInterceptor(new HttpLoggingInterceptor().setLevel(getLogLevel()));
OkHttpClient okHttpClient = okHttpClientBuilder.build();
이때sslSocketFactory(SSLSocketFactory sslSocketFactory)
deprecated니까.sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager)
, X509 TrustManager가 필요하지만 sslSocketFactory 설명에 기재된 기술을 통해 얻을 수 있습니다.private X509TrustManager getTrustManager() throws NoSuchAlgorithmException, KeyStoreException {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
}
return (X509TrustManager) trustManagers[0];
}
참조: https://github.com/square/okhttp/issues/2372
WebView 정보
Google이 패치를 제공하지 않은 4.3 미만의 WebView(WebKit)에 대해서는 대응할 수 없으며 4.4 이후의 WebView(Chromium)로 한정해야 합니다.
보충으로 5.0 이후의 웹뷰는 구글플레이에서 업데이트됐지만 4.4의 웹뷰는 크롬의 물건의 OS 동단이기 때문에 제조공장 업데이트 상황에 따라 다를 수 있다.
4.4 Chrome의 기본 버전은 30.0, TLS1입니다.2 대응하는 것이지만 앞으로 업데이트하지 말고 주의하는 것이 좋습니다.
참조: WebView for Android : What version of Chrome is it based on?
결론
minSDK21을 원해요!
Reference
이 문제에 관하여(Android 4 시스템 터미널의 TLS11&1.2 대응), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ntsk/items/9f31fc7b44c04ea45e0b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
public class TLSSocketFactory extends SSLSocketFactory {
private SSLSocketFactory internalSSLSocketFactory;
public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
internalSSLSocketFactory = context.getSocketFactory();
}
@Override
public String[] getDefaultCipherSuites() {
return internalSSLSocketFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return internalSSLSocketFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket() throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
}
private Socket enableTLSOnSocket(Socket socket) {
if(socket != null && (socket instanceof SSLSocket)) {
((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
}
return socket;
}
}
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
// 4.4.4以前のみで作成したsslSocketFactoryを使うようにする
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
try {
okHttpClientBuilder
.connectionSpecs(Collections.singletonList(new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS).build()))
.sslSocketFactory(new TLSSocketFactory(), getTrustManager());
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
throw new RuntimeException(e);
}
}
// その他の設定
okHttpClientBuilder
.addInterceptor(new HttpLoggingInterceptor().setLevel(getLogLevel()));
OkHttpClient okHttpClient = okHttpClientBuilder.build();
sslSocketFactory(SSLSocketFactory sslSocketFactory)
sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager)
private X509TrustManager getTrustManager() throws NoSuchAlgorithmException, KeyStoreException {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
}
return (X509TrustManager) trustManagers[0];
}
Google이 패치를 제공하지 않은 4.3 미만의 WebView(WebKit)에 대해서는 대응할 수 없으며 4.4 이후의 WebView(Chromium)로 한정해야 합니다.
보충으로 5.0 이후의 웹뷰는 구글플레이에서 업데이트됐지만 4.4의 웹뷰는 크롬의 물건의 OS 동단이기 때문에 제조공장 업데이트 상황에 따라 다를 수 있다.
4.4 Chrome의 기본 버전은 30.0, TLS1입니다.2 대응하는 것이지만 앞으로 업데이트하지 말고 주의하는 것이 좋습니다.
참조: WebView for Android : What version of Chrome is it based on?
결론
minSDK21을 원해요!
Reference
이 문제에 관하여(Android 4 시스템 터미널의 TLS11&1.2 대응), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ntsk/items/9f31fc7b44c04ea45e0b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Android 4 시스템 터미널의 TLS11&1.2 대응), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ntsk/items/9f31fc7b44c04ea45e0b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)