web-dev-qa-db-ja.com

https接続でNSURLSession / NSURLConnection HTTPロードに失敗しました(kCFStreamErrorDomainSSL、-9802)エラー

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];

しかし、このエラーが発生する

エラードメイン= NSURLErrorDomainコード= -1200「SSLエラーが発生し、サーバーへの安全な接続を確立できません。」 UserInfo = {NSLocalizedDescription = SSLエラーが発生し、サーバーへの安全な接続を確立できません。、NSLocalizedRecoverySuggestion =とにかくサーバーに接続しますか?、_ kCFStreamErrorDomainKey = 3、NSUnderlyingError = 0x7c1075e0 {エラードメイン= kCFErrorDomainCFNetworkコード=- 1200 "(null)" UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0、_kCFNetworkCFStreamSSLErrorOriginalValue = -9802、_kCFStreamErrorCodeKey = -9802、_kCFStreamErrorDomainKey = 3、kCFStreamPropertySSLPeerTrust =、kCFStreamPropertySSLPeerCertificates = {type = immutable、count = 3、 )}}}、_ 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/6 262u9665.jpg }

これはhttps接続ですが、なぜこの奇妙なエラーが発生するのですか。誰か教えてもらえますか?.

14
IronMan

Apple テクニカルノート )に従って、App Transport SecurityにはSHA-2が必要です。S3(およびCloudFront)証明書はSHA-1を使用しているため、この失敗は発生します。

回避策は、NSExceptionRequiresForwardSecrecyfalseに設定することです。 (これは、AWSがSHA-2に移行するまでです( 2015年9月30日まで ))。

SHA-1 Signature

27

私はAmazonS3でもこれに遭遇しました。残念ながら、私はあなたに言うことができませんなぜこれが起こっている-S3は前方秘書要件を満たしているようです( 少なくともこの回答によると) ):

 Adams-MacBook-Pro:tmp Adam $ curl -kvI https://s3.amazonaws.com 
 * URLをhttps://s3.amazonaws.com/[.____に再構築しました。 ] * 54.231.32.128 ... 
 *を試行中

回避策 ここで見つけました アプリのInfo.plistファイルに例外を追加して、転送秘密を必要としないようにします。

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

私の知る限り、これはAmazonS3に接続するために組み込みのセキュリティを減らすことができる最小量です。

7
Adam S

ここで提供されている他の回答と ここ の助けを借りて、複数の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>
2
frankhermes

私にとっての解決策は、ドメインに次の例外を追加することでした。

<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>xxx.com</key>
        <dict>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>
0
Arturo Marzo