我正在编写一个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
}
答案 0 :(得分:11)
我认为添加不受信任的证书(至少在模拟器中)是不可能的,但您可以告诉您的NSURLConnection代表接受自签名证书(或通常不受信任的证书)
以下链接帮助我解决了这个问题!
How to use NSURLConnection to connect with SSL for an untrusted cert?
答案 1 :(得分:0)
信任所有证书是一个非常糟糕的主意。恶意用户可以对您的用户执行中间人攻击,以读取或更改所有传输的数据。
我相信您的证书不包含验证系统受信任根证书路径所需的所有中间证书。可以通过某些SSL配置验证工具将其报告为不完整的证书链。
您可以通过将证书中的所有证书连接到受信任的根证书(按此顺序排除)来手动解决不完整证书链问题,以防止出现此类问题。请注意,受信任的根证书不应该存在,因为它已包含在系统的根证书存储区中。
您应该能够从发卡行获取中间证书,并自己将它们连接在一起。我编写了一个脚本来自动执行该过程,它需要一个证书来生成正确链接的证书的输出。 https://github.com/zakjan/cert-chain-resolver