IOS HTTPS證書問題

2021-06-21 16:49:41 字數 2286 閱讀 7807

本文節選自

一般而言http和https都不會遇到這個問題,只要實現nsurlconnectiondatadelegate協議就能完成需求。但是對於自簽名證書,nsurlconnection物件無法驗證服務端證書的真偽。這個時候需要動用到nsurlconnectiondelegate協議。

具體方法是以下幾個:

- (bool)connection:(nsurlconnection *)connection canauthenticateagainstprotectionspace:(nsurlprotectionspace *)prote

- (void)connection:(nsurlconnection *)connection didreceiveauthenticationchallenge:(nsurlauthenticationchallenge *)challenge;

其中canauthenticateagainstprotectionspace如果返回no,將由系統自行處理。返回yes將會由後續的didreceiveauthenticationchallenge處理。預設為no。

- (bool)connection:(nsurlconnection *)connection canauthenticateagainstprotectionspace:(nsurlprotectionspace *)protectionspace

didreceiveauthenticationchallenge中我們要通過challengesender告知是否信任服務端的證書。
- (void)connection:(nsurlconnection *)connection didreceiveauthenticationchallenge:(nsurlauthenticationchallenge *)challenge

else

}

我們可以設定trusted來判定是否信任。可以直接設定為yes來表示信任服務端。但是直接設定是不嚴謹的,並沒有驗證服務端證書的真偽。

在連線建立後,我們可以拿到服務端的證書。要驗證它的真偽需要我們用ca的證書來進行判定。

// 獲取der格式ca證書路徑

nsstring *certpath = [[nsbundle mainbundle] pathforresource:@"ca" oftype:@"der"];

// 提取二進位制內容

nsdata *derca = [nsdata datawithcontentsoffile:certpath];

// 根據二進位制內容提取證書資訊

seccertificateref caref = seccertificatecreatewithdata(null, (__bridge cfdataref)derca);

// 形成鑰匙鏈

nsarray * chain = [nsarray arraywithobject:(__bridge id)(caref)];

cachainarrayref = cfbridgingretain(chain);

// 取出伺服器證書

sectrustref trust = [[challenge protectionspace] servertrust];

sectrustresulttype trustresult = 0;

// 設定為我們自有的ca證書鑰匙連

int err = sectrustsetanchorcertificates(trust, cachainarrayref);

if (err == noerr)

cfrelease(trust);

// 檢查結果

bool trusted = (err == noerr) && ((trustresult == ksectrustresultproceed)||(trustresult == ksectrustresultconfirm) || (trustresult == ksectrustresultunspecified));

uiwebview不能處理自簽名的證書,需要在它發起訪問之前通過上述的方法進行證書的設定判定,之後再通過uiwebview進行訪問即可通過。

延伸閱讀:

ios: https 與自簽名證書

iOS HTTPS 自建證書

絕大部分ios程式的後台服務都是基於restful或者webservice的,不論在任何時候,你都應該將服務置於https上,因為它可以避免中間人攻擊的問題,還自帶了基於非對稱金鑰的加密通道!現實是這些年湧現了大量速成的移動端開發人員,這些人往往基礎很差,完全不了解加解密為何物,使用https後,可...

關於iOS HTTPS中間人攻擊

中間人攻擊 關於https,我經常會提到的就是中間人攻擊,那究竟什麼是中間人攻擊呢?中間人攻擊,即所謂的main in the middle attack mitm 顧名思義,就是攻擊者插入到原本直接通訊的雙方,讓雙方以為還在直接跟對方通訊,但實際上雙方的通訊對方已變成了中間人,資訊已經是被中間人獲...

Redis Gem 證書問題

如果您使用的是redis 5或更高版本,這很容易完成,因為嵌入到中的redis cluster命令列實用程式為我們提供了幫助,該實用程式redis cli可用於建立新集群,檢查或重新分片現有集群等。對於redis版本3或4,有乙個稱為的舊工具redis trib.rb,它非常相似。您可以src在re...