#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/…