天天看點

asihttprequest連接配接https-其實是結合網友們的精華

今天總結一下糾結了我近一個星期的問題,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 (assign) CFStringRef *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];