2010-08-23 130 views
6

我目前正嘗試使用自簽名證書連接到服務器。我正在使用NSURLConnection連接到服務器。我如何確保我只信任正確的服務器並取消所有其他連接?我使用下面的代碼無法信任iphone上的自簽名證書

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 

    SecTrustResultType results; 
    SecTrustRef trust = [[challenge protectionSpace] serverTrust]; 

    SecTrustEvaluate(trust, &results); 

    if (results == kSecTrustResultProceed || results == kSecTrustResultConfirm) { 
     [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
    } else { 
     [challenge.sender cancelAuthenticationChallenge:challenge]; 
    } 

} 

目前SecTrustEvaluate總是與結果等於kSecTrustResultRecoverableTrustFailure返回。我使用iphone配置實用程序在手機上安裝了帶有證書的配置文件,並將其標記爲已驗證,但未更改結果。

任何人都可以幫我獲得kSecTrustResultProceedkSecTrustResultConfirm的自信簽名結果嗎?

回答

4

您需要確保您的證書具有特定的擴展名。我配置了以下擴展名的證書,它爲我工作(OpenSSL的格式):

basicConstraints=critical,CA:FALSE 
extendedKeyUsage=serverAuth 
subjectAltName=IP:192.168.x.y 
+1

尼斯尖端,它的工作原理,如果你正在** ** kSecTrustResultRecoverableTrustFailure ......特別是「的Su​​bjectAltName」鍵是非常重要。如果你的服務器在被調用時響應DNS,你應該使用'subjectAltName = DNS:example.com',或者如果你想'subjectAltName = IP:10.0.1.5,DNS:example.com'。謝謝 ! – gwdp 2012-01-20 06:30:32