業務で Android アプリを作成していると development (開発) サーバなどで所謂独自 (オレオレ) 証明書を使っていることがよくある。普通に HTTPS アクセスしに行くと SSLHandshakeException がスローされ失敗する。その為証明書検証をスキップして接続する必要が出てくる。当然本番環境ではそのような SSL 証明書は使用されないので、開発環境の為だけの 本来の開発と関係ない作業 をやらされるのが辛い。手っ取り早くやっつけたいところだ。
Volley でどうやるのか分からなかったので調べてみた。Volley.newRequestQueue()
に詰める HurlStack インスタンスに対してオレオレ証明の検証をスキップする SSLSocketFactory を詰めるといいようだ。
private static SSLSocketFactory getAllAllowsSocketFactory() {
try {
// ホスト名検証をスキップする
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
// 証明書検証スキップする空の TrustManager
final TrustManager[] manager = {new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// do nothing
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// do nothing
}
}};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, manager, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
return sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException | KeyManagementException e) {
throw new AndroidRuntimeException(e);
}
}
このメソッドを以下のように使用する:
final HurlStack stack = new HurlStack(null, getAllAllowsSocketFactory());
// アプリケーションレベルで Singleton 保持するのがよい
sQueue = Volley.newRequestQueue(context, stack);