多くの場所で説明されているように、証明書の検証を単にバイパスすることは、非常に多くのレベルで間違っています。やめてください!
代わりに、証明書からファイルを作成する必要があります.bks
(そのためには、Bouncy Castleが必要です)。
keytool -importcert -v -trustcacerts -file "path/to/certfile/certfile.crt" -alias IntermediateCA -keystore "outputname.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "path/to/bouncycastle/bcprov-jdk15on-154.jar" -storetype BKS -storepass atleastsix
次に、新しく作成したフォルダoutputname.bks
内に配置します。res/raw
ヘルパー関数を作成します(独自のクラスまたは好きなものの中にある可能性があります):
private static SSLSocketFactory getSocketFactory(Context ctx) {
try {
// Get an instance of the Bouncy Castle KeyStore format
KeyStore trusted = KeyStore.getInstance("BKS");
// Get the raw resource, which contains the keystore with
// your trusted certificates (root and any intermediate certs)
InputStream in = ctx.getResources().openRawResource(R.raw.outputname); //name of your keystore file here
try {
// Initialize the keystore with the provided trusted certificates
// Provide the password of the keystore
trusted.load(in, "atleastsix".toCharArray());
} finally {
in.close();
}
// Pass the keystore to the SSLSocketFactory. The factory is responsible
// for the verification of the server certificate.
SSLSocketFactory sf = new SSLSocketFactory(trusted);
// Hostname verification from certificate
// http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); // This can be changed to less stricter verifiers, according to need
return sf;
} catch (Exception e) {
throw new AssertionError(e);
}
}
最後になりましたがAsyncHttpClient
、新しいソケットファクトリを使用するように設定します。
AsyncHttpClient client = new AsyncHttpClient();
client.setSSLSocketFactory(getSocketFactory(context));