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のユーザのために働いている知っているソリューションです
返信いただきありがとうございます。われわれのMFPサーバーには、特別なネイティブコーディングを必要とせずにこの問題の修正が必要だとお考えですか?私たちはアンドロイド環境を削除し、上記で提供されたMFPバージョンでそれを再作成し、クラスを再びインポートしましたが、同じ問題です。 PMRを開くことをお勧めしますか?上記のコードは私たちのためには機能しませんでしたが、私たちは依然として理由を理解しようとしています。 –
先ほど触れたAPARの修正は、MFP 7.1 IF20160709-0639以降のビルドに表示されるので、この問題は発生しません。追加のネイティブ・コーディングを行う必要はありません。これはSDKの修正であり、サーバーの修正ではないことに注意してください。 - アプリケーションをビルドするために使用するMFP Studio(またはCLI)のバージョンはIF20160709-0639以降でなければなりません。 。 – patbarron
この問題が引き続き発生する場合は、そのAPARで修正されたものとは異なる問題が発生している可能性があります。詳細な調査が必要な場合は、PMRを開くことは合理的な選択肢になります。 – patbarron