私はこのチュートリアルに成功しました。
サーバー証明書を格納してアプリケーションに追加するために、キーストアファイル(例: "cert_keystore.pkcs12")を作成する必要があります。
キーストアファイルにPKCS12形式を使用するのが最も簡単だとわかりました。 (keytool
を使用してキーストアを変換するときに-deststoretype PKCS12
paramを追加してください)
私のテストサーバーはIPアドレスを使用していたため、自己署名証明書で動作するようにホスト名検証を無効にしなければなりませんでした。このother tutorialは役に立ちました。
カスタムHostnameVerifierでHttpsURLConnection.setDefaultHostnameVerifier()
を追加し、newSslSocketFactory()にHttpsURLConnection.setDefaultSSLSocketFactory()
を追加する必要がありました。
(newSslSocketFactory()Volley.newRequestQueue(mCtx.getApplicationContext(), new HurlStack(null, newSslSocketFactory())
に使用されている)
新しいnewSslSocketFactory()関数は以下のようになります。
private SSLSocketFactory newSslSocketFactory()
{
try
{
KeyStore trusted = KeyStore.getInstance ("PKCS12");
// Get the raw resource, which contains the keystore with
// your trusted certificates (root and any intermediate certs)
InputStream in = mCtx.getApplicationContext().getAssets().open ("cert_keystore.pkcs12");
try {
// Initialize the keystore with the provided trusted certificates
// Provide the password of the keystore
trusted.load (in, "password".toCharArray());
} finally {
in.close();
}
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(trusted);
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify (String hostname, SSLSession session) {
return hostname.equals ("192.168.1.10"); //The Hostname of your server
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory sf = context.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory (sf);
return sf;
}
catch (Exception e)
{
throw new AssertionError(e);
}
}