Не удается использовать самозаверяющий сертификат в Android

#android #ssl #iis #https #ssl-certificate

#Android #ssl #iis #https #ssl-сертификат

Вопрос:

Он выдает исключение, подобное приведенному ниже

 javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
  

Эта программа для Android подключается к моему ASP.NET MVC развернут в IIS, и я создаю файл .csr .key .crt моего центра сертификации и сертификата моего сервера, используя OpenSSL.
И я конвертирую .crt файл сертификата моего сервера в .pfx формат и импортирую его в IIS.

Я нашел решение в Android Developer. Но мой код похож на код, который он перечисляет.

  CertificateFactory cf = CertificateFactory.getInstance("X.509","BC");

 InputStream caInput = getResources().openRawResource(R.raw.root);  //here "R.raw.root" is a .bks file converted from my CA's .crt file , and a .bks file converted from my server's .crt file , but both throw this exception
 Certificate ca;
 try
{
     ca = cf.generateCertificate(caInput);

} finally

{
      caInput.close();
}

// Create a KeyStore containing our trusted CAs
//String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance("BKS");
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 context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(),null);

// Tell the URLConnection to use a SocketFactory from our SSLContext
URL url = new URL("https://172.18.13.178:63123/Home/Test");
HttpsURLConnection urlConnection =(HttpsURLConnection) url.openConnection();
urlConnection.setSSLSocketFactory(context.getSocketFactory());
InputStream in = urlConnection.getInputStream();

//omit other code
}
  

Разработчик Android говорит, что это решение этой ошибки, но я пишу свой код, похожий на него, но он терпит неудачу.

Итак, кто-нибудь скажет мне, в чем проблема? Способ, который предоставляет Android Development, не работает.

Комментарии:

1. Если ваш minSdkVersion 24 или выше, используйте конфигурацию сетевой безопасности . Если вам minSdkVersion от 17 до 23, попробуйте мой бэкпорт конфигурации сетевой безопасности . В противном случае, AFAIK, setCertificateEntry("ca", ca) предназначен для настройки пользовательского центра сертификации, а не для самозаверяющего сертификата. Код, который я использовал для самозаверяющих сертификатов, переданных в InputStream типе хранилища ключей и в load() на KeyStore .

2. @CommonsWare как » код, который я использовал для самозаверяющих сертификатов, переданных в InputStream тип хранилища ключей и в load() на KeyStore «? Можете ли вы показать мне эту строку кода?

3. github.com/commonsguy/cwac-security/blob/master/security/src/… , который вызывается github.com/commonsguy/cwac-security/blob/master/security/src/…