iPhone上的“不受信任的服务器证书”

Posted

技术标签:

【中文标题】iPhone上的“不受信任的服务器证书”【英文标题】:"untrusted server certificate" on iPhone 【发布时间】:2010-07-05 08:43:49 【问题描述】:

我正在编写一个 iPhone 应用程序,我想连接到“HTTPS”服务器以获取一些信息。但是,我在控制台中收到错误

NSUnderlyingError = 错误域=kCFErrorDomainCFNetwork 代码=-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
    

【问题讨论】:

【参考方案1】:

我认为添加不受信任的证书(至少在模拟器中)是不可能的,但您可以告诉您的 NSURLConnection 代表接受自签名证书(或通常不受信任的证书)

以下链接帮助我解决了这个问题!

How to use NSURLConnection to connect with SSL for an untrusted cert?

【讨论】:

谢谢你,山姆。这是非常有用的。但我还有 1 个问题,我应该把代码放在哪里。我曾经将代码放在 .m 类中。但它没有用。我查看了苹果开发者网站,我知道那些是预定义的函数,但是我应该在哪里调用呢?我也曾经把 NSLog() 用来打印内容,但是我看不到 NSLog 的内容。非常感谢。 请在您的另一个线程中看到我的回答,同样的问题 :).. thxs【参考方案2】:

信任所有证书是一个非常糟糕的主意。恶意人员可以对您的用户执行中间人攻击以读取或更改所有传输的数据。

我相信您的证书不包含验证系统可信根证书路径所需的所有中间证书。一些 SSL 配置验证工具可能会将其报告为不完整的证书链

您可以通过将证书中的所有证书连接到受信任的根证书(不包括,按此顺序)手动解决证书链不完整问题,以防止此类问题。请注意,受信任的根证书不应存在,因为它已包含在系统的根证书存储中。

您应该能够从颁发者那里获取中间证书并自己将它们连接在一起。我编写了一个脚本来自动化该过程,它需要一个证书来生成正确链接证书的输出。 https://github.com/zakjan/cert-chain-resolver

【讨论】:

以上是关于iPhone上的“不受信任的服务器证书”的主要内容,如果未能解决你的问题,请参考以下文章

向 iphone Simulator 添加自签名证书?

Android 2.2 但不是 3.0 中的“不受信任的服务器证书”

将自签名证书添加到iphone Simulator?

HTTPS 连接安卓

使用Charles 4.1.1 抓取iPhone上的数据接口

使用Charles 4.1.1 抓取iPhone上的数据接口