Запрос HTTPS в iOS 9: NSURLSession/NSURLConnection Ошибка загрузки HTTP (kCFStreamErrorDomainSSL, -9802)

Я обновляю приложение для размещения новых ATS в Apple. Без каких-либо изменений в Plist-Info следующий код выдает ошибку в sendSynchronousRequest() в ванильном симуляторе iOS 9.

NSURL *url  =[NSURL URLWithString:@"https://Google.com"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setHTTPMethod:@"GET"];
[request setURL:url];

NSURLResponse *urlResponse = nil;
NSError *error = nil;    
NSData *reponse = [NSURLConnection sendSynchronousRequest:request
                                        returningResponse:&urlResponse
                                                    error:&error];

Ошибка:

Ошибка загрузки NSURLSession/NSURLConnection HTTP (kCFStreamErrorDomainSSL, -9802)

Любые мысли о том, что может быть позади этой проблемы?

Ps: Я понимаю, что NSURLConnection устарел. Но эта работа AllowArbitraryLoads поиск, если я добавлю AllowArbitraryLoads в Plist.

Ответы

Ответ 1

NSURLSession/NSURLConnection Ошибка загрузки HTTP (kCFStreamErrorDomainSSL, -9802) соответствует серверу, не поддерживающему "Forward Secrecy".

Чтобы обойти это, добавьте исключение домена в файл .plist следующим образом:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>test.testdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

Ответ 2

Добавьте новую строку в свой файл plist.

Добавить новую строку в ваш файл plist

Ответ 3

Я добавил этот код в info.plist, чтобы разрешить любой запрос http:

 <key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

В этой статье перечислены все изменения, внесенные Apple для iOS 9 и их реализации:

http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Ответ 4

В соответствии с этим: https://forums.developer.apple.com/message/36842#36842

Исправлено правильное исключение для исправления загрузки HTTP (kCFStreamErrorDomainSSL, -9802):

NSExceptionAllowsInsecureHTTPLoads 

Ответ 5

Добавьте в файл info.plist следующее. И замените "My_Base_Url.com" на ваш URL-адрес ссылки на веб-службу. Это должно сделать трюк.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>My_Base_Url.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
        </dict>
    </dict>
</dict>

Ответ 6

Если ваше приложение включает страницу H5, иногда она также будет иметь эту ошибку.
Это требует не только включить Allow Arbitrary Loads, но и потребовать добавить код ниже в appDelegate.m:


@implementation NSURLRequest(ATS)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
    return YES;
}
@end