2017-07-20 10 views
1

MobileFirst 7.1.0.00.20170627-0807で動作するモバイルハイブリッドプロジェクトがあります。Android OS 4.4.2/MobileFirstハイブリッドアプリケーションでTLS 1.2を有効にする

TLS 1.0および1.1のサポートを停止するようにサーバー設定を変更し、以下の参照情報に基づいてAndroid開発をサポートするためにAndroid搭載デバイス4.4.2で動作するモバイルアプリを破ったTLS 1.2を使用するようにしました

Custom SSLSocketFactory Implementation to enable tls 1.1 and tls 1.2 for android 4.1 (16+)

:下記のブログではなく、運に参照されるよう

ANDROID VERSIONS 4.4.2 AND EARLIER CANNOT CONNECT TO SERVER USING HTTPS IF ONLY TLS 1.2 IS ENABLED

私たちは、複数のソリューションを試してみました

package ca.company.project; 

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.security.KeyManagementException; 
import java.security.NoSuchAlgorithmException; 

import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 

/** 
* @author fkrauthan 
*/ 
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; 
    } 
} 

、同じディレクトリMobileBanking.javaの下にある私のネイティブコードで、私は以下のコードを追加しました:私は、カスタムのSSLSocketFactoryをサポートするためのJavaファイルを追加した私のネイティブコードディレクトリca.company.project

onCreate():

package ca.company.project; 

    import org.apache.cordova.CordovaActivity; 

    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.content.Context; 
    import android.content.DialogInterface; 
    import android.content.DialogInterface.OnClickListener; 
    import android.content.pm.ActivityInfo; 
    import android.content.res.Configuration; 
    import android.os.Bundle; 
    import android.util.DisplayMetrics; 
    import android.view.WindowManager.LayoutParams; 
    import android.content.pm.PackageManager; 
    import com.adobe.mobile.*; 

    import com.worklight.androidgap.api.WL; 
    import com.worklight.androidgap.api.WLInitWebFrameworkListener; 
    import com.worklight.androidgap.api.WLInitWebFrameworkResult; 
    import com.worklight.wlclient.api.WLClient; 


    import javax.net.ssl.SSLSocketFactory; 

    import java.security.KeyManagementException; 
    import java.security.NoSuchAlgorithmException; 
    import java.security.SecureRandom; 
    import java.security.cert.CertificateException; 
    import java.security.cert.X509Certificate; 

    import javax.net.ssl.HostnameVerifier; 
    import javax.net.ssl.HttpsURLConnection; 
    import javax.net.ssl.SSLContext; 
    import javax.net.ssl.SSLSession; 
    import javax.net.ssl.TrustManager; 
    import javax.net.ssl.X509TrustManager; 


    import android.os.*; 

    public class MobileBanking extends CordovaActivity implements WLInitWebFrameworkListener { 

     @Override 
     public void onCreate(Bundle savedInstanceState){ 
      super.onCreate(savedInstanceState); 


      /*getWindow().setFlags(LayoutParams.FLAG_SECURE, 
        LayoutParams.FLAG_SECURE);*/ 

      WL.createInstance(this); 


    try{ 
     SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(null, null, null); 
     SSLSocketFactory noSSLv3Factory = null; 
     if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.KITKAT) { 
      noSSLv3Factory = new TLSSocketFactory(); 
     } else { 
      noSSLv3Factory = sslContext.getSocketFactory(); 
     } 
     HttpsURLConnection.setDefaultSSLSocketFactory(noSSLv3Factory); 

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




      WL.getInstance().showSplashScreen(this); 

      WL.getInstance().initializeWebFramework(getApplicationContext(), this); 

      if(isTabletDevice(this)){ 
       //Tablet 
    //   System.out.println("isTablet oncreate"); 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
      } else { 
       //Phone 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
      } 
      // Allow the SDK access to the application context 
      Config.setContext(this.getApplicationContext()); 
     } 

私は行方不明か何か変更する必要がありますか?

私はすぐにあなたが提供したコードにコメントすることはできませんが、ここで私は同じ問題に向け、他のMFPのユーザのために働いている知っているソリューションです

答えて

0

:このGitHub repoに行く)

1は、と取ります「TlsSniSocketFactory.java」、「IgnoreSSLTrustManager.java」、および「SelfSignedTrustManager.java」のクラスです。このオープンソース・コードはIBMによって提供されておらず、IBMはこれをサポートしていません。

2)これらのクラスをアプリケーションに含めます。アプリケーションに同意するようにパッケージ名を変更します。

private void replaceSocketFactory(LayeredSocketFactory tlsSocketFactory) { 
     HttpClientManager manager = HttpClientManager.getInstance(); 
     HttpClient client= manager.getHttpClient(); 
     SchemeRegistry schemeRegistry = client.getConnectionManager().getSchemeRegistry(); 
     Scheme httpsScheme = schemeRegistry.getScheme("https"); 
     schemeRegistry.unregister("https"); 
     Scheme newScheme = new Scheme("https", tlsSocketFactory, httpsScheme.getDefaultPort()); 
     schemeRegistry.register(newScheme); 
    } 

4)Activity.onCreate右WL.createInstance後()メソッド(この)からこのメソッドを呼び出し;

3)はCordovaActivityを拡張アプリケーションメイン活性におけるこの方法はインクルード

@Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     WL.createInstance(this); 
     replaceSocketFactory(new TlsSniSocketFactory()); 

     WL.getInstance().showSplashScreen(this); 

     WL.getInstance().initializeWebFramework(getApplicationContext(), this); 
    } 

は、私はあなたがこの問題に対する修正が含まれて使用しているMFP 7.1のビルドとして、この問題を見ている理由はわかりません。修正を含まないiFixのバージョンから以前に更新していた場合は、アプリケーションから「アンドロイド」環境を削除して、再度追加する必要があります。

+0

返信いただきありがとうございます。われわれのMFPサーバーには、特別なネイティブコーディングを必要とせずにこの問題の修正が必要だとお考えですか?私たちはアンドロイド環境を削除し、上記で提供されたMFPバージョンでそれを再作成し、クラスを再びインポートしましたが、同じ問題です。 PMRを開くことをお勧めしますか?上記のコードは私たちのためには機能しませんでしたが、私たちは依然として理由を理解しようとしています。 –

+0

先ほど触れたAPARの修正は、MFP 7.1 IF20160709-0639以降のビルドに表示されるので、この問題は発生しません。追加のネイティブ・コーディングを行う必要はありません。これはSDKの修正であり、サーバーの修正ではないことに注意してください。 - アプリケーションをビルドするために使用するMFP Studio(またはCLI)のバージョンはIF20160709-0639以降でなければなりません。 。 – patbarron

+0

この問題が引き続き発生する場合は、そのAPARで修正されたものとは異なる問題が発生している可能性があります。詳細な調査が必要な場合は、PMRを開くことは合理的な選択肢になります。 – patbarron

関連する問題