2010-08-23 54 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