2014-05-21 42 views
1

我試圖將我的應用程序連接到具有錯誤主機名的服務器證書的開發服務器,但它由受信任的錨定證書籤名。當我評估服務器信任對象時,它按預期失敗。我正在嘗試更改服務器主機名的信任評估策略,但似乎沒有幫助。覆蓋TLS服務器驗證主機名似乎不工作

// In -connection:willSendRequestForAuthenticationChallenge: 
// NSURLAuthenticationMethodServerTrust 
SecTrustRef trust = [challenge.protectionSpace serverTrust]; 
SecTrustResultType trustResult; 
SecTrustEvaluate(trust, &trustResult); 
// trustResult == kSecTrustResultRecoverableTrustFailure 

SecPolicyRef policyOverride = SecPolicyCreateSSL(true, (CFStringRef)@"devhost"); 
CFArrayRef policies = (CFArrayRef)@[policyOverride]; 
SecTrustSetPolicies(trust, policies); 
CFRelease(policyOverride); 
SecTrustEvaluate(trust, &trustResult); 
// trustResult == kSecTrustResultRecoverableTrustFailure 

據我瞭解,我第二次打電話SecTrustEvaluate(),它應該返回kSecTrustResultUnspecified。當我初始化NSURLConnection時,我已經使用「devhost」連接到dev服務器,並且也使用了「devhost」。我在這裏做錯了什麼?

回答

1

我在調用SecPolicyCreateSSL時使用了錯誤的主機名。

當使用SecPolicyCreateSSL覆蓋主機名驗證時,hostname參數應與您正在驗證的證書匹配。然後,驗證假設您正在與之通信的主機具有新指定的主機名。

在我的情況下,服務器中是否有「* .mydomain.tld」的證書,所以我打電話

SecPolicyCreateSSL(true, (CFStringRef)@"devhost.mydomain.tld"); 

,然後證書鏈,可以成功地驗證。