今天总结一下纠结了我近一个星期的问题,asihttprequest连接https,正常是有2种思路。

1、忽略证书验证连接https

2、带着证书请求https。(但是鉴于具有有效期,证书失效就得重新设置,前后端都得改代码,对于一个企业级的内部应用来说,个人觉得不太适合。)

具体说说第1种思路,网上找了很多,大多数都是直接来了2句代码:

  [request setAuthenticationScheme:@"https"];   

  [request setValidatesSecureCertificate:NO];


也许有的asihttprequest框架是可以行得通的,可是我没成功过。说说我的解决方(ASIHTTPRequest.m必须是开发的

  1)ASIHTTPRequest.m中找到NSMutableDictionary*类型的sslProperties变量,添加一个键值对到该变量。

if (![self validatesSecureCertificate]) {

           [sslProperties setObject:(NSString *)kCFBooleanFalse forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];

        }改成

if (![self validatesSecureCertificate]) {

            [sslProperties setObject:(NSString *)kCFBooleanFalse forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];

            [sslProperties setObject:(NSString *)(CFStringRef *)kCFStreamSocketSecurityLevelSSLv3 forKey:(NSString *)kCFStreamSSLLevel];

        }

    然后我们在使用的时候直接设置[request setValidatesSecureCertificate:NO]即可。

  2)其实最好设置一个对外开发的属性变量,避免对其他代码造成影响,如下

     ASIHTTPRequest.h

     @property (assignCFStringRef *sslSecurityLevel;

     ASIHTTPRequest.m

    @synthesize sslSecurityLevel;

     然后在.m文件中找到if (![self validatesSecureCertificate]) {

           [sslProperties setObject:(NSString *)kCFBooleanFalse forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];

        },在下面添加如下代码

if ([self sslSecurityLevel] != nil) {

            [sslProperties setObject:(NSString *)[self sslSecurityLevel] forKey:(NSString *)kCFStreamSSLLevel];

        }

     最后在连接https的时候设置2个属性即可,

    [request setValidatesSecureCertificate:NO];

    [request setSslSecurityLevel:(CFStringRef *)kCFStreamSocketSecurityLevelSSLv3];