5

iPhoneアプリケーションを作成していますが、「HTTPS」サーバーに接続して情報を取得したいと思います。ただし、コンソールでエラーが発生します。

NSUnderlyingError = Error Domain = kCFErrorDomainCFNetwork Code = -1202 UserInfo =0x3e95cf0"このサーバーの証明書が無効です。機密情報を危険にさらす可能性のある「example.com」のふりをしているサーバーに接続している可能性があります。"; }

証明書を信頼してhttpステータスコード200を取得するにはどうすればよいですか?

以下は私のコードです。

    NSMutableURLRequest *request_get2 = [[[NSMutableURLRequest alloc] init] autorelease];
    [request_get2 setURL:[NSURL URLWithString:@"https://www.example.com"]]; 
    [request_get2 setHTTPMethod:@"GET"];
    [request_get2 setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    //[request_get2 setValue:@"text/html; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    [request_get2 setValue:@"https://www.example.com" forHTTPHeaderField:@"Referer"];
    [request_get2 setHTTPShouldHandleCookies:YES];
    // cookiesString is in format "cookieName=cookieValue;"
    [request_get2 setValue: (NSString *) cookiesString forHTTPHeaderField:@"Cookie"];


    // doGet - response
    NSHTTPURLResponse *response_get2 = nil;  // it change from 'NSURLRespaonse' to 'NSHTTPURLResponse'
    NSError *error_get2 = nil;
    NSData *responseData_get2 = [NSURLConnection sendSynchronousRequest:request_get2 returningResponse:&response_get2 error:&error_get2];
    NSString *data_get2 = [[NSString alloc]initWithData:responseData_get2 encoding:NSUTF8StringEncoding];

    if (!error_get2) {
        NSString *responseURL_get2 = [[response_get2 URL] absoluteString];           // null value
        NSString *responseTextEncodingName_get2 = [response_get2 textEncodingName];  // null value
        NSString *responseMIMEType_get2 = [response_get2 MIMEType];                  // null value
        NSUInteger *responseStatusCode_get2 = [response_get2 statusCode]; //[responseStatusCode intValue]; // the status code is 0
    }
    else {
        NSLog(@"\nsomething went wrong: %@\n", [error_get2 userInfo]); // got the error in here
    }
4

2 に答える 2

11

信頼できない証明書を追加することは(少なくともシミュレーターでは)不可能だと思いますが、NSURLConnection Delegateに自己署名証明書(または一般的に信頼できない証明書)を受け入れるように指示できます。

次のリンクは私が問題を解決するのに役立ちました!

NSURLConnectionを使用して信頼できない証明書のSSLに接続するにはどうすればよいですか?

于 2010-07-05T12:08:00.973 に答える
0

すべての証明書を信頼することは非常に悪い考えです。悪意のある人物がユーザーに対して中間者攻撃を実行して、転送されたすべてのデータを読み取ったり変更したりする可能性があります。

システムの信頼されたルート証明書へのパスを検証するために必要なすべての中間証明書が証明書に含まれているとは限りません。一部のSSL構成検証ツールでは、不完全な証明書チェーンとして報告される可能性があります。

このような問題を防ぐために、証明書から信頼されたルート証明書(この順序で排他的)にすべての証明書を連結することにより、不完全な証明書チェーンの問題を手動で解決できます。信頼されたルート証明書は、システムのルート証明書ストアにすでに含まれているため、そこに存在してはならないことに注意してください。

発行者から中間証明書をフェッチして、自分でそれらを連結できるはずです。手順を自動化するスクリプトを作成しました。正しくチェーンされた証明書の出力を生成するには、証明書が必要です。https://github.com/zakjan/cert-chain-resolver

于 2015-01-19T05:25:45.097 に答える