2017-04-03 5 views
2

Android 4.4(APIレベル19)を実行している端末で作業しています。しかし、サーバーに接続するアプリケーションを開発する必要があるのは、TLSv1.2とSHA256の暗号だけです。私は、従来のapacheライブラリと更新されたapache 4.4.1.2(cz.msebera.android)を使ってSSLコンテキストを作成しようとしました。コンテキストを作成してサポートされている暗号を取得した後は、SHA256は含まれていません。プログラムは他のAndroid 5.0以降のデバイスで正常に動作しています。Android 4.4はSHA256で暗号をサポートできますか?

私の質問は、Android 4.4デバイスでTLSv1.2と暗号SHA256をサポートする方法は何ですか?

ありがとうございました。アンドロイド4.4を実行

答えて

0

ためにのみ使用可能であり、Iは

package com.bbpos.www.payment_gp.webservice; 

public class NoSSLv3SocketFactory extends SSLSocketFactory { 
private final SSLSocketFactory delegate; 

public NoSSLv3SocketFactory() { 
    this.delegate = HttpsURLConnection.getDefaultSSLSocketFactory(); 
} 

public NoSSLv3SocketFactory(SSLSocketFactory delegate) { 
    this.delegate = delegate; 
} 

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

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

private Socket makeSocketSafe(Socket socket) { 
    if (socket instanceof SSLSocket) { 
     String[] protocols = { 
       "TLSv1.1", 
       "TLSv1.2" 
     }; 
     ((SSLSocket) socket).setEnabledProtocols(protocols); 
    } 
    return socket; 
} 

@Override 
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { 
    return makeSocketSafe(delegate.createSocket(s, host, port, autoClose)); 
} 

@Override 
public Socket createSocket(String host, int port) throws IOException { 
    return makeSocketSafe(delegate.createSocket(host, port)); 
} 

@Override 
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { 
    return makeSocketSafe(delegate.createSocket(host, port, localHost, localPort)); 
} 

@Override 
public Socket createSocket(InetAddress host, int port) throws IOException { 
    return makeSocketSafe(delegate.createSocket(host, port)); 
} 

@Override 
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { 
    return makeSocketSafe(delegate.createSocket(address, port, localAddress, localPort)); 
} 

} 

をし、プログラムの先頭に工場を初期化します:このように私自身のSSLファクトリを作成することで、問題を解決し

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { 

     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return new java.security.cert.X509Certificate[0]; 
     } 

     public void checkClientTrusted(java.security.cert.X509Certificate[] certs, 
             String authType) { 
     } 

     public void checkServerTrusted(java.security.cert.X509Certificate[] certs, 
             String authType) { 
     } 
    }}; 
    try { 
     SSLContext sc; 
     sc = SSLContext.getInstance("TLS"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     SSLSocketFactory NoSSLv3Factory = new NoSSLv3SocketFactory(sc.getSocketFactory()); 
     HttpsURLConnection 
       .setDefaultSSLSocketFactory(NoSSLv3Factory); 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
      @Override 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }); 

    } catch (Exception e) 
    { 

    } 
+0

どのように問題を解決しますか?あなたはTLS 1.1と1.2を有効にしていますが、 'get * CipherSuites()'をデフォルトのSSLソケットファクトリに委譲しています。このファクトリファクトリは元の問題だったSHA1暗号だけを返します – Hilikus

関連する問題