iOS AFNetworking HTTPS 認證

HTTPS 中雙向認證SSL 協議的具體過程:html

這裏總結爲詳細的步驟:web

① 瀏覽器發送一個鏈接請求給安全服務器。xcode

② 服務器將本身的證書,以及同證書相關的信息發送給客戶瀏覽器。瀏覽器

③ 客戶瀏覽器檢查服務器送過來的證書是不是由本身信賴的 CA 中心所簽發的。若是是,就繼續執行協議;若是不是,客戶瀏覽器就給客戶一個警告消息:警告客戶這個證書不是能夠信賴的,詢問客戶是否須要繼續。安全

④ 接着客戶瀏覽器比較證書裏的消息,例如域名和公鑰,與服務器剛剛發送的相關消息是否一致,若是是一致的,客戶瀏覽器承認這個服務器的合法身份。服務器

⑤ 服務器要求客戶發送客戶本身的證書。收到後,服務器驗證客戶的證書,若是沒有經過驗證,拒絕鏈接;若是經過驗證,服務器得到用戶的公鑰。app

⑥ 客戶瀏覽器告訴服務器本身所可以支持的通信對稱密碼方案。post

⑦ 服務器從客戶發送過來的密碼方案中,選擇一種加密程度最高的密碼方案,用客戶的公鑰加過密後通知瀏覽器。google

⑧ 瀏覽器針對這個密碼方案,選擇一個通話密鑰,接着用服務器的公鑰加過密後發送給服務器。加密

⑨ 服務器接收到瀏覽器送過來的消息,用本身的私鑰解密,得到通話密鑰。

⑩ 服務器、瀏覽器接下來的通信都是用對稱密碼方案,對稱密鑰是加過密的。

轉自AFNetworking的https雙向認證

通常來說若是app用了web service , 咱們須要防止數據嗅探來保證數據安全.一般的作法是用ssl來鏈接以防止數據抓包和嗅探

其實這麼作的話仍是不夠的 。 咱們還須要防止中間人攻擊(不明白的本身去百度)。攻擊者經過僞造的ssl證書使app鏈接到了假裝的假冒的服務器上,這是個嚴重的問題!那麼如何防止中間人攻擊呢?

首先web服務器必須提供一個ssl證書,須要一個 .crt 文件,而後設置app只能鏈接有效ssl證書的服務器。

在開始寫代碼前,先要把 .crt 文件轉成 .cer 文件,而後在加到xcode 裏面

可使用openssl 進行轉換


openssl x509 -in你的證書.crt -out你的證書.cer -outform der


使用AFNetworking 對數據進行只須要兩步

第一步:新增一個類

+ (AFSecurityPolicy*)customSecurityPolicy

{

// /先導入證書

NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"hgcang" ofType:@"cer"];//證書的路徑

NSData *certData = [NSData dataWithContentsOfFile:cerPath];

// AFSSLPinningModeCertificate 使用證書驗證模式

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

// allowInvalidCertificates 是否容許無效證書(也就是自建的證書),默認爲NO

// 若是是須要驗證自建證書,須要設置爲YES

securityPolicy.allowInvalidCertificates = YES;

//validatesDomainName 是否須要驗證域名,默認爲YES;

//假如證書的域名與你請求的域名不一致,需把該項設置爲NO;如設成NO的話,即服務器使用其餘可信任機構頒發的證書,也能夠創建鏈接,這個很是危險,建議打開。

//置爲NO,主要用於這種狀況:客戶端請求的是子域名,而證書上的是另一個域名。由於SSL證書上的域名是獨立的,假如證書上註冊的域名是www.google.com,那麼mail.google.com是沒法驗證經過的;固然,有錢能夠註冊通配符的域名*.google.com,但這個仍是比較貴的。

//如置爲NO,建議本身添加對應域名的校驗邏輯。

securityPolicy.validatesDomainName = NO;

securityPolicy.pinnedCertificates = @[certData];

return securityPolicy;

}


第二步:直接在請求方法里加入,只有一行代碼

+ (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure

{

// 1.得到請求管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 2.申明返回的結果是text/html類型

mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

// 加上這行代碼,https ssl 驗證。

//[mgr setSecurityPolicy:[self customSecurityPolicy]];

// 3.發送POST請求

[mgr POST:url parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObj) {

if (success) {

success(responseObj);

}

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

if (failure) {

failure(error);

}

}];

}
相關文章
相關標籤/搜索