iOS 9中的HTTPS请求:NSURLSession/NSURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9802)

15
我正在更新我的应用程序以适应苹果的新 ATS。在不修改 Plist-Info 的情况下,以下代码在原始的 iOS 9 模拟器中在 sendSynchronousRequest() 处抛出错误。
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)

您有什么想法可能是导致这个问题的原因吗?

附言:我知道NSURLConnection已被弃用。但是,如果我在Plist中添加AllowArbitraryLoads,这种调用就可以正常工作。


1
在苹果论坛的网络版块中查看。我在那里发布了问题并得到了很好的答复,其他人也是如此。 - David H
找不到了,你能分享一下链接吗? - Vignesh Murugesan
3
这是链接:https://forums.developer.apple.com/thread/6452 - David H
谢谢提供这个链接!论坛中提到的唯一 "大锤" 方法对我起了作用 :-) 可能是因为我使用 IP 地址而不是域名进行连接。 - Alexey
6个回答

14

NSURLSession/NSURLConnection的HTTP加载失败(kCFStreamErrorDomainSSL,-9802)对应于服务器不支持“前向保密”。

为了解决这个问题,请在.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>

1
在plist中添加上述代码后,我仍然遇到了相同的错误:NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)。错误信息为:Optional(Error Domain=NSURLErrorDomain Code=-1200 "发生了SSL错误,无法与服务器建立安全连接。" - Yalamandarao
我仍然面临这个问题,你们找到解决方案了吗? - Sanju
不起作用。我应该使用test.testdomain.com还是类似于:test.testdomain.com/some/path/here? - Josh
即使添加了上述步骤,我仍然遇到了相同的问题。 - Nirmalsinh Rathod

9
在您的plist文件中添加一行。

在您的plist文件中添加一行


1
完美。对我有用。看到你的图片后更新更容易了。谢谢:D - Reanimation

6
我在info.plist中添加了以下代码以允许任何http请求:

我在info.plist中添加了以下代码以允许任何http请求:

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

本文列出了苹果在iOS 9中所做的所有更改及其实现方式。具体内容请参考以下链接:http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

我默认在plist信息中拥有这个,但仍然失败了。 - Naga

1
如果您的应用程序包含H5页面,有时也会出现此错误。
仅打开允许任意加载不能解决问题,还需要在您的appDelegate.m中添加以下代码:

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

我该如何在Xamarin Forms中将它添加到我的AppDelegate? - Pxaml
@Pxaml,不熟悉Xamarin。该代码实现了一个NSURLRequest类别。您可以查看如何在Xamarin中添加类别。 - scorpiozj

1
请将以下内容添加到info.plist文件中,并将'My_Base_Url.com'替换为您的Web服务链接的基本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>

0

1
那个情况很有趣 - 谢谢分享。在我的情况下,这个错误是由于服务器不支持前向保密所导致的。我们最终在服务器端修复了密码套件列表以支持FwSec,并解决了该应用程序问题(异常“..ExceptionRequiresForwardSecrecy”不再需要)。 - Vignesh Murugesan
我们的问题是由于在测试虚拟机中使用了自签名证书所致。 - spirographer
@spirographer - 那你是怎么让你的虚拟机上的自签名证书工作的呢? - ness-EE
@ness-EE我强烈推荐使用https://letsencrypt.org/,现在他们已经推出了。这样你就不需要任何例外来支持VM与生产环境的不同。 - spirographer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接