Ошибка загрузки 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?

Другие вопросы по тегам