Обработка ошибки самозаверяющего сертификата SSL - SSLHandShakeException - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь подключиться к серверу API с самозаверяющим SSL-сертификатом из приложения для Android.У меня есть файлы сертификатов SSL .crt и .cer.Я провел много исследований и получил следующие коды с файлом сертификата .crt, помещенным в папку raw:

CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream inStream = MainActivity.context.getResources().openRawResource(R.raw.mysslcert);
Certificate ca = cf.generateCertificate(inStream);
inStream.close();

String keyStoreType = KeyStore.getDefaultType();
KeyStore ks = KeyStore.getInstance(keyStoreType);
ks.load(null, null);
ks.setCertificateEntry("ca", ca);

String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(ks);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null,tmf.getTrustManagers(), null);

URL url = new URL("https://myAPIurl.com/MyFunction");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(sslContext.getSocketFactory());

BufferedReader buffReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

Когда коды запускаются до последней строки в conn.getInputStream (), он выдает ошибку «SSLHandShakeException: Соединение закрыто одноранговым узлом» и ничего не возвращает.Я застрял.Кто-нибудь может указать, что я сделал не так?Является ли это даже правильным подходом для решения проблемы соединения https?

Дополнительная информация: я протестировал URL-адрес API в браузере и убедился, что он возвращает строку данных.Я полагаю, что сервер API использует TLS1.0.

...