https

简单的介绍下方法:还未验证 

  ASIHTTPRequest 

    这个开源项目也是流行很久了, 但是一般都是用来替代NSURLConnection,其实里面的功能还是挺强大的,只是对于HTTPS访问这一块我有点不太满意,
  里面有一个方法,是可以直接忽略证书验证的, 

  disabling secure certificate validation

You may wish to use this for testing purposes if you have a self-signed secure certificate. I recommend purchasing a certificate from a trusted certificate authority and leaving certificate validation turned on for production applications.

[request setValidatesSecureCertificate:NO];

但是这样做有一点危险,如果是放在企业环境里部署的话,那外面的人都可以访问内部的网站了,SSL这一层就形同虚设。所以我又找了一下,发现他还有另一个方法,可以设置客户端的证书:

Client certificates support
If your server requires the use of client certificates, as of v1.8 it is now possible to send them with your request.

// Will send the certificate attached to the identity (identity is a SecIdentityRef)
[request setClientCertificateIdentity:identity];

// Add an additional certificate (where cert is a SecCertificateRef)
[request setClientCertificates:[NSArray arrayWithObject:(id)cert]];
There is a helper function in 'ClientCertificateTests.m' in the iPhone / iPad sample app that can create a SecIdentityRef from PKCS12 data (this function only works on iOS).

这个方法需要把p12文件放进工程里面,然后调用[ClientCertificateTest extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data]; 来获取identity
,这个方法是这样的  
+ (BOOL)extractIdentity:(SecIdentityRef *)outIdentity andTrust:(SecTrustRef*)outTrust fromPKCS12Data:(NSData *)inPKCS12Data
{
    OSStatus securityError = errSecSuccess;
    
    NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:@"" forKey:(id)kSecImportExportPassphrase];
    
    CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
    securityError = SecPKCS12Import((CFDataRef)inPKCS12Data,(CFDictionaryRef)optionsDictionary,&items);
    
    if (securityError == 0) { 
        CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex (items, 0);
        const void *tempIdentity = NULL;
        tempIdentity = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemIdentity);
        *outIdentity = (SecIdentityRef)tempIdentity;
        const void *tempTrust = NULL;
        tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust);
        *outTrust = (SecTrustRef)tempTrust;
    } else {
        NSLog(@"Failed with error code %d",(int)securityError);
        return NO;
    }
    return YES;
}
这个方法需要引用到Security.framework这个框架(我第一次没有引用,结果报错,我想官方的东西怎么还有错呢,郁闷了好久才发现是这个框架没有引用,晕死)。之后应该就是通过[ASIHTTPRequest startSynchronous] 可以访问HTTPS网站了。  为什么说是应该呢? 因为我也没有试出来,呵呵 ```可能是证书的问题,我在extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data 这个方法里获取到的securityError 为-26275 ,在网上找了半天也没找出个结果来,所以也只能暂时搁置了。


-(void) viewHomePage{
    NSURL *url=[NSURL URLWithString:homeUrl];
    
    NSBundle *bundle = [NSBundle mainBundle]; //取得mainBundle
    NSString *plistPath = [bundle pathForResource:@"Root" ofType:@"plist"]; //取得文件路径
    // 或可以写成
    // NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"文件名" ofType:@"plist"];
    //读取到一个NSDictionary
    NSArray  *array=[[NSArray alloc]initWithContentsOfFile:plistPath];
    
    NSDictionary *dictionary = [array objectAtIndex:1];
    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults registerDefaults:dictionary];
    
    BOOL needAuthentication=[defaults boolForKey:@"needAuth"];
    
    SecIdentityRef identity = NULL;
    SecTrustRef trust = NULL;
    NSData *PKCS12Data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ioa.bingosoft.net" ofType:@"pfx"]];
    [SenchaShellViewController extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data];
    
    //******************   调用 ASIHTTPRequest 访问HTTPS站点  ****************
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
    [request setClientCertificateIdentity:identity];
    //[request setValidatesSecureCertificate:NO];
    //[request startSynchronous];
    [request setValidatesSecureCertificate:needAuthentication];
    [request startSynchronous];
    
    NSError *error = [request error];
    if (!error) {
        [self.viewer loadHTMLString:[request responseString] baseURL: [request url]];
    }
    else {
        NSLog(@"Error: %@", error );
    }

你可能感兴趣的:(https)