web-dev-qa-db-ja.com

NSURLConnection / CFURLConnection HTTPロードに失敗しました(kCFStreamErrorDomainSSL、-9813)iOS

現在、私はiosでブロックを使用して石鹸のWebサービスを使用しています。私のソースコードは次のとおりです。

NSString *xml = requestXMLToSent;

NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[xml length]];
NSURL *serviceURL = [NSURL URLWithString: url];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:serviceURL];

[urlRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[urlRequest addValue: serviceURL forHTTPHeaderField:@"SOAPAction"];
[urlRequest addValue:msgLength  forHTTPHeaderField:@"Content-Length"];
[urlRequest setHTTPBody: [xml dataUsingEncoding:NSUTF8StringEncoding]];
[urlRequest setHTTPMethod:@"POST"];

[NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {


    if (connectionError == NULL) {

        NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;
        NSInteger statuscode = httpResponse.statusCode;
        if (statuscode == 200) {

            NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"response String  : %@",responseString);


        }else{
            NSLog(@"%@",response);

        }




    }else{

        NSLog(@"There is an error in URL connection and the Error is : %@",connectionError);
    }

コンソールで次のエラーが発生します@コンソール

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

URL接続にエラーがあり、エラーは:Error Domain = NSURLErrorDomain Code = -1202 "このサーバーの証明書は無効です。" www.xxxxxxxx.net "のふりをしているサーバーに接続している可能性があります。機密情報を危険にさらしてください。」 UserInfo = 0x10948bbb0 {NSUnderlyingError = 0x109470d10「このサーバーの証明書は無効です。機密情報を危険にさらす可能性がある「www.xxxxxx.net」のふりをしているサーバーに接続している可能性があります。」、NSErrorFailingURLStringKey = https: // www .----------------------------------、NSErrorFailingURLKey = https:// ----- -------------------- NSLocalizedRecoverySuggestion =それでもサーバーに接続しますか?、NSURLErrorFailingURLPeerTrustErrorKey =、NSLocalizedDescription =このサーバーの証明書は無効です。機密情報が危険にさらされる可能性のある「www.xxxxxx.net」になりすましているサーバーに接続している可能性があります。}

Screenshot of error

10
Sumit Patel

サーバーがスローしています[〜#〜] ssl [〜#〜]証明書エラー。テストのために、次のコードをappDelegateに追加できます:+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)Host { return YES; }

これはSSLエラーをバイパスします

注:NSURLConnectionとUIWebViewでは機能しますが、WKWebViewでは機能しません

編集:

IOS 9の場合、上記の手順は機能しません。次のスニペットをinfo.plistに追加します。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
12
Shanu ji

ServiceURLでhttpsスキームを使用していて、テストサーバーでSSL証明書に問題があると思います。信頼できる場合は、NSURLConnectionデリゲートに次のメソッドを実装します。

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    if([challenge.protectionSpace.Host isEqualToString:@"127.0.0.1"] /*check if this is Host you trust: */ )
       [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}

デリゲートにNSURLConnectionを初期化するには、たとえばinitWithRequest:delegate:startImmediately: 方法。

9
user2260054

IOS 9.0では、以下をinfo.plistに追加します

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

デリゲートが実際に呼び出されていることを確認してください。

このドキュメントでは、デリゲートが特定の状況で呼び出されない場合があることを説明しています。

https://developer.Apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/AuthenticationChallenges.html

重要:サーバーの応答にWWW-Authenticateヘッダーが含まれていない限り、URLロードシステムクラスは、デリゲートを呼び出してリクエストチャレンジを処理しません。プロキシ認証やTLS信頼検証などの他の認証タイプでは、このヘッダーは必要ありません。

0
user1951992