Android Volley Self подписанный сертификат
Я пытаюсь получить доступ к HTTPS URL из моего приложения для Android. У меня есть самоподписанный сертификат для моего сервера (server_certificate.cer).
Я хочу знать, как добавить самоподписанный сертификат в сетевые запросы залпа, чтобы доверять моему самоподписанному сертификату. попробовал с http://blog.applegrew.com/2015/04/using-pinned-self-signed-ssl-certificate-with-android-volley/
и получение javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: доверенная привязка для пути сертификации не найдена.
1 ответ
Я успешно следовал этому руководству.
Вам необходимо создать файл хранилища ключей (например, "cert_keystore.pkcs12"), в котором будет содержаться сертификат вашего сервера, и добавить его в свое приложение.
Я обнаружил, что проще всего использовать формат PKCS12 для файла хранилища ключей. (добавлять -deststoretype PKCS12
параметр при преобразовании хранилища ключей с помощью keytool
)
Мой тестовый сервер был на IP-адресе, мне пришлось отключить проверку имени хоста, чтобы он работал с моим самозаверяющим сертификатом. Этот другой урок был полезен.
Я должен был добавить HttpsURLConnection.setDefaultHostnameVerifier()
с пользовательским HostnameVerifier и HttpsURLConnection.setDefaultSSLSocketFactory ()
в newSslSocketFactory().
(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);
}
}