Android 4.1以降の自己署名SSL証明書をVolleyにインポートする方法
-
21-12-2019 - |
質問
私は volley を使うAndroidアプリケーションを開発します。 すべての通信は https 接続を介して行われます。 ローカル環境でテストするので、Tomcat用の自己署名証明書を使用しています。
前、私はAndroid 2.3 と 3.0 デバイスのみを持っていました。今、私は 4.1と4.4 も持っています。
私の実装はこのアプローチを使用します: http://developer.android.com/training/articlics/security-ssl.html (Part 未知の認証局) Android までのデバイスで4.1 それは完全に機能します。カスタム証明書を使用したSSLSocketFactoryは、VOLLEYに渡されます。
Volley.newRequestQueue(getApplicationContext(), new HurlStack(null, socketFactory));
.
しかし、Android 4.1以降で何が起こりますか? なぜそれがうまくいかないのですか? nullx509trustmanager でも試してみました:
private static class NullX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType)
throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType)
throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}
.
しかしそれはまだ動作しません...
解決
ここに記載されている解決策で解決しました:
http://developer.android.com/training/articles/security-ssl.html
<強力>ホスト名検証に関する一般的な問題
カスタムホスト名Verifierを追加することで、Volleyプロジェクトのホスト名にtrueを返し、HurlStack OpenConnectionメソッドを編集する:
if ("https".equals(url.getProtocol()) && mSslSocketFactory != null) {
((HttpsURLConnection)connection).setSSLSocketFactory(mSslSocketFactory);
((HttpsURLConnection)connection).setHostnameVerifier(new CustomHostnameVerifier());
}
. 他のヒント
既に .crt ファイルを持っていて、 volley に添付しようとしている場合は、次に続く2つの簡単なステップです。
ステップ1:このメソッドをコードに書き込みます。
public SSLSocketFactory getSocketFactory(Context context)
throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
// Load CAs from an InputStream (could be from a resource or ByteArrayInputStream or ...)
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = new BufferedInputStream(context.getResources().openRawResource(R.raw.myFile));
// I paste my myFile.crt in raw folder under res.
Certificate ca;
//noinspection TryFinallyCanBeTryWithResources
try {
ca = cf.generateCertificate(caInput);
System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
} finally {
caInput.close();
}
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// Create an SSLContext that uses our TrustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
}
.
ステップ2:ボーリーを使用して要求を行う前に、以下の行を追加するだけです。
HttpsURLConnection.setDefaultSSLSocketFactory(getSocketFactory(context));
.
Android Studioは、私たちの方法によってスローされたすべての例外のためにその行を試してみてください。だからそれをさせてください。
ハッピーコーディング!
すべてのSSL証明書を信頼する: - テストサーバーでテストしたい場合は、SSLをバイパスできます。 しかし、このコードを製造するために使用しないでください。
public static class NukeSSLCerts {
protected static final String TAG = "NukeSSLCerts";
public static void nuke() {
try {
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
X509Certificate[] myTrustedAnchors = new X509Certificate[0];
return myTrustedAnchors;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
} catch (Exception e) {
}
}
.
}
アクティビティまたはアプリケーションクラスのoncreate()関数でこの関数を呼び出してください。
NukeSSLCerts.nuke();
.
これはAndroidのボレーに使用できます。 その他の参照。 https://newfivefour.com/android-trust-all-ssl-29999HTML