Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在ASIHTTPRequest中包含客户端证书?_Iphone_Ssl_Https_Request_Asihttprequest - Fatal编程技术网

Iphone 如何在ASIHTTPRequest中包含客户端证书?

Iphone 如何在ASIHTTPRequest中包含客户端证书?,iphone,ssl,https,request,asihttprequest,Iphone,Ssl,Https,Request,Asihttprequest,我对目标C和HTTPs非常陌生。请就此事向我提出建议 我需要我的iPhone应用程序通过HTTPs与服务器通信。我创建了自签名证书,当通过浏览器访问URL时,它会显示一条警告消息,表明服务器不受信任。没关系 从我的iPhone应用程序发送HTTP请求。通过HTTPS,我正在使用ASIHTTPRequest。但我收到一条错误消息“发生连接故障:SSL问题(可能的原因包括坏的/过期的/自签名的证书,时钟设置为错误的日期)” 我浏览了Stackoverflow并学会了以下方法: 我从浏览器下载了证书,

我对目标C和HTTPs非常陌生。请就此事向我提出建议

我需要我的iPhone应用程序通过HTTPs与服务器通信。我创建了自签名证书,当通过浏览器访问URL时,它会显示一条警告消息,表明服务器不受信任。没关系

从我的iPhone应用程序发送HTTP请求。通过HTTPS,我正在使用ASIHTTPRequest。但我收到一条错误消息“发生连接故障:SSL问题(可能的原因包括坏的/过期的/自签名的证书,时钟设置为错误的日期)”

我浏览了Stackoverflow并学会了以下方法:

  • 我从浏览器下载了证书,并将其包含到我的Xcode项目中
  • 将证书加载到NSData

    NSString*fullFileName=@“myCertificate.cer”; NSString*fileName=[[fullFileName lastPathComponent]stringByDeletingPathExtension]; NSString*扩展名=[fullFileName路径扩展名]; NSData*PKCS12Data=[NSData DATA WITH CONTENTS OFFILE:[[NSBundle mainBundle]pathForResource:类型的文件名:扩展名]]

  • 例外身份

    [self-extractIdentity:&identity and trust:&trust fromPKCS12Data:PKCS12Data密码:@“myCertificatePasswordHere”]

  • 通过HTTPS发送HTTP请求

    ASIHTTPRequest*请求=[AsiHttpRequestRequestWithURL:myHTTPsURLHere]; [请求setClientCertificateIdentity:identity]; [请求启动同步]

  • 正如这里很多人建议的那样,我还修改了ASIHTTPRequest.m并包括

  • [SSLProperty setObject:(NSString*)kCFBooleanTrue forKey:(NSString*)KCFStreamSlallowsExpiredCertificates]; [SSLProperty setObject:(NSString*)kCFBooleanTrue forKey:(NSString*)KCFStreamSlallowsExpiredRoots]

    转换为IF语句

       if (![self validatesSecureCertificate]) {
    
         NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys:
                                               [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
                                               [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                                               [NSNumber numberWithBool:NO],  kCFStreamSSLValidatesCertificateChain,
                                               kCFNull,kCFStreamSSLPeerName,
                                               @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
                                               nil];
    
        CFReadStreamSetProperty((CFReadStreamRef)[self readStream], 
                                        kCFStreamPropertySSLSettings, 
                                        (CFTypeRef)sslProperties);
    
    
                [sslProperties release];
            }else {
                NSMutableDictionary *sslProperties = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                               [NSNumber numberWithBool:NO], kCFStreamSSLAllowsExpiredCertificates,
                                               [NSNumber numberWithBool:NO], kCFStreamSSLAllowsAnyRoot,
                                               [NSNumber numberWithBool:YES],  kCFStreamSSLValidatesCertificateChain,
                                               @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
                                               nil];
    
                CFReadStreamSetProperty((CFReadStreamRef)[self readStream], 
                                        kCFStreamPropertySSLSettings, 
                                        (CFTypeRef)sslProperties);
    
                [sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredCertificates]; // Sergey added this line
                [sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredRoots]; // Sergey added this line 
                [sslProperties release];
            } 
    
    但它没有帮助:(.我仍然收到一条错误消息:

      Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred: SSL problem (Possible causes may include a bad/expired/self-signed certificate, clock set to wrong date)"
    
    请告诉我如何通过HTTPs进行ASIHTTPRequest,以便我的服务器验证客户端证书?我不想使用私有api


    非常感谢!

    ASIHttpRequest和iOS 5确实存在一个bug。
    一个对我有效的修复方法是:

    iOS版本5.0.1的ASIHTTPRequest中有一个SSL验证错误。它已在此处修复(感谢ignaval)ASIHTTPRequest不再受开发人员支持,不应使用。如果要使用第三方框架,请使用。