本文節選自
一般而言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
中我們要通過challenge
的sender
告知是否信任服務端的證書。- (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...