Я пытаюсь интегрировать закрепление сертификата (SSL) с HttpsURLConnection на Android.Я следовал этому руководству в документах .Это то, что у меня есть
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate ca;
try (ByteArrayInputStream cert = new ByteArrayInputStream(MY_CERT_STRING.getBytes())) {
ca = cf.generateCertificate(cert);
}
//build the certificate
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
Сертификат успешно создан и соответствует сертификату однорангового узла.Примечание: я также попытался установить фабрику сокетов непосредственно на объекте соединения.Это не внесло никаких изменений.
Проблема в том, что я получаю 401 (неавторизованную) ошибку с сервера.Когда я иду отлаживать объект соединения, я вижу, что getLocalCertificates()
возвращает null
, а getServerCertificates()
возвращает список сертификатов.Таким образом, я предполагаю, что сертификат не установлен должным образом, и тогда рукопожатие терпит неудачу.