【问题标题】:NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) error in https connectionhttps 连接中的 NSURLSession/NSURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9802) 错误
【发布时间】:2015-11-19 03:02:31
【问题描述】:

在 iOS 9 中,我正在使用基本的 NSURLConnection 请求 url https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg

NSOperationQueue *completionQueue = [NSOperationQueue mainQueue];
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    self.mURLSession = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:completionQueue];

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg"]];
    NSURLSessionDataTask *dataTask = [self.mURLSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSLog(@"%@",error);
    }];
    [dataTask resume];

但出现此错误

Error Domain=NSURLErrorDomain Code=-1200 “发生 SSL 错误,无法与服务器建立安全连接。” UserInfo={NSLocalizedDescription=发生 SSL 错误,无法与服务器建立安全连接。, NSLocalizedRecoverySuggestion=您是否仍要连接到服务器?, _kCFStreamErrorDomainKey=3, NSUnderlyingError=0x7c1075e0 {Error Domain=kCFErrorDomainCFNetwork 代码=- 1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorCodeKey=-9802, _kCFStreamErrorDomainKey=3, kCFStreamPropertySSLPeerTrust=, kCFStreamPropertySSLPeerCertificates={type = immutable, count = 3, values = ( 0: 1: 2: )}}}, _kCFStreamErrorCodeKey=-9802, NSErrorFailingURLStringKey=https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg, NSErrorPeerCertificateChainKey={type = immutable, count = 3, values = ( 0: 1: 2: )}, NSErrorClientCertificateStateKey=0, NSURLErrorFailingURLPeerTrustErrorKey=, NSErrorFailingURLKey=https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg}

即使这是 https 连接,为什么我会收到这个奇怪的错误。谁能告诉我。

【问题讨论】:

  • 我对这个问题不太了解,但我相信在 iOS 9 上仅使用 HTTPS 是不够的——您的连接还需要至少使用 TLS 1.2。您可以四处搜索并找到一项服务,该服务会告诉您是否为此服务器启用了该服务。这就是我前段时间看到这个错误的原因。

标签: objective-c iphone amazon-s3 https ios9


【解决方案1】:

对我来说,解决方案是为域添加此例外:

<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>xxx.com</key>
        <dict>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

【讨论】:

    【解决方案2】:

    我在使用 Amazon S3 时也遇到过这种情况。不幸的是,我无法告诉您为什么会发生这种情况 - S3 似乎满足前向保密要求 (at least according to this answer):

    Adams-MacBook-Pro:tmp Adam$ curl -kvI https://s3.amazonaws.com * 重建 URL 至:https://s3.amazonaws.com/ * 尝试 54.231.32.128... * 连接到 s3.amazonaws.com (54.231.32.128) 端口 443 (#0) * 使用 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 的 TLS 1.2 连接

    解决方法which I found here 是在应用的 Info.plist 文件中添加一个例外,以不需要前向保密:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>s3.amazonaws.com</key>
            <dict>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
    </dict>
    

    据我所知,这是为了连接到 Amazon S3,您可以降低内置安全性的最低限度。

    【讨论】:

      【解决方案3】:

      在此处提供的其他答案和 here 的帮助下,我修复了需要连接到 多个 cloudfront.net 子域的应用,并将此添加到 plist:

              <key>NSAppTransportSecurity</key>
              <dict>
                  <key>NSExceptionDomains</key>
                  <dict>
                      <key>cloudfront.net</key>
                          <dict>
                          <!--Include to allow subdomains-->
                          <key>NSIncludesSubdomains</key>
                          <true/>
                          <key>NSExceptionRequiresForwardSecrecy</key>
                          <false/>
                      </dict>
                  </dict>
              </dict>
      

      【讨论】:

        【解决方案4】:

        根据 Apple tech note,应用传输安全需要 SHA-2。 S3(和 CloudFront)证书使用 SHA-1,这就是发生此故障的原因。

        解决方法是将NSExceptionRequiresForwardSecrecy 设置为false。 (直到 AWS 迁移到 SHA-2 (by September 30th, 2015))。

        【讨论】:

        • 收到此错误:App Transport Security 已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用的 Info.plist 文件配置临时例外。
        • 在“info.plist”的“App Transport Security Settings”中添加异常域。
        猜你喜欢
        • 1970-01-01
        • 2015-09-04
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 2015-10-18
        • 2017-06-10
        • 2015-12-29
        • 1970-01-01
        相关资源
        最近更新 更多