Ошибка загрузки HTTP NSURLConnection (kCFStreamErrorDomainSSL, -9813)
Мое приложение работало нормально, когда я использовал http://domain.com
, Но сегодня, когда я изменился http://
в https://
Я сталкиваюсь с этой проблемой: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
, Я также внес изменения в .plist
, Вот мой .plist
код:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>dev.domainName.in</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
</dict>
</dict>
</dict>
Но все же я сталкиваюсь с этой проблемой. Пожалуйста, помогите мне. Что мне не хватает?
2 ответа
На основании ваших комментариев о том, что вы получаете недопустимую ошибку сертификата и что вы используете NSURLConnection, ваше решение заключается в реализации этих делегатов. Посмотрим, решит ли это проблему.
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]
forAuthenticationChallenge:challenge];
}
Обратите внимание, что вы, по сути, игнорируете ошибку SSL и позволяете установить соединение. Так что, если вы открываете приложение для взлома. Для тестирования вы можете использовать это, но убедитесь, что вы установили соответствующий сертификат в производственной среде.
Но если вы хотите справиться с этим правильно и предупредить пользователя в случае, если сертификат не является надлежащим, вы можете сделать это.
OSStatus err = noErr;
BOOL trusted = NO;
NSURLProtectionSpace * protectionSpace = challenge.protectionSpace;
SecTrustRef serverTrustRef = protectionSpace.serverTrust;
SecTrustResultType trustResult;
//check if the server trust that we got from the server can be trusted by default
err = SecTrustEvaluate(serverTrustRef, &trustResult);
trusted = (err == noErr) && ((trustResult == kSecTrustResultProceed) || (trustResult == kSecTrustResultUnspecified));
if (trusted) //if the site is trusted then continue with that trust
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:protectionSpace.serverTrust]
forAuthenticationChallenge:challenge];
}
else //if not then warn the user about this and let the user make a decision
{
//warn the user about the cert problem using a dialog with options to continue or ignore.
//Continue alert action call : [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]
forAuthenticationChallenge:challenge];
//Dont continue action: [challenge.sender continueWithoutCredentialForAuthenticationChallenge:_challenge];
//OR call: [sender cancelAuthenticationChallenge:challenge];
}
}
Начиная с iOS 9, Apple ввела ATS. Вот документация относительно этого. Попробуйте ослабить ограничения и посмотреть, работает ли это.
Работает ли это на устройствах с версиями ОС до iOS 9?