Android HttpsURLConnection работает с самозаверяющим сертификатом на эмуляторе, но не на реальном устройстве - PullRequest
1 голос
/ 24 марта 2020

Я использовал эту команду для создания самозаверяющего сертификата для сервера nginx, работающего на экземпляре EC2

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/selfsigned.key -out /etc/ssl/certs/selfsigned.crt

В качестве общего имени (например, полное доменное имя сервера или ВАШЕ имя), я использовал Publi c DNS экземпляра EC2, что-то вроде ec2-somenumber.region.compute.amazon aws .com

Я использую этот код для решения проблем доверия, я скопировал selfsigned.crt в папку raw приложения и использовал его таким образом:

CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = getResources().openRawResource(R.raw.selfsigned);
Certificate ca = cf.generateCertificate(caInput);

// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);

// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);

// Create an SSLContext that uses our TrustManager
SSLContext _sslContext = SSLContext.getInstance("TLS");
_sslContext.init(null, tmf.getTrustManagers(), null);

URL url = new URL("https://ec2-somenumber.region.compute.amazonaws.com");
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setSSLSocketFactory(_sslContext.getSocketFactory());

Теперь он отлично работает на эмуляторе, но когда я пытаюсь отладить его на реальном устройстве, он выдает мне эту ошибку:

 javax.net.ssl.SSLPeerUnverifiedException: Hostname ec2-somenumber.region.compute.amazonaws.com not verified

Я прочитал Здесь много вопросов о stackoverlow, и я на самом деле не хочу переопределять hostnameVerifier, пока не пойму, почему он работает на эмуляторе, а не на реальном устройстве.

У вас есть предложения?

Спасибо

1 Ответ

0 голосов
/ 25 марта 2020

Если у вас возникла та же проблема, пожалуйста, обратитесь к этой ссылке для генерации сертификата.

Чтобы заставить самозаверяющий сертификат работать на реальном устройстве, мне нужно было указать альтернативное имя субъекта, например это в файле ssl.conf, который я использовал для создания сертификата

[alt_names]
DNS.1   = ec2-somenumber.region.compute.amazonaws.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...