Переопределение имени хоста проверки сервера 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
, Я подключился к серверу dev, используя "devhost", когда инициализировал NSURLConnection, и challenge.protectionSpace.host == @"devhost"
также. Что я здесь не так делаю?
1 ответ
Я использовал неправильное имя хоста в вызове SecPolicyCreateSSL
,
Когда используешь SecPolicyCreateSSL
чтобы переопределить проверку имени хоста, аргумент имени хоста должен соответствовать аргументу, который вы проверяете. Затем проверка делает вид, что у хоста, с которым вы общаетесь, новое имя хоста.
В моем случае на сервере есть сертификат для "*.mydomain.tld", поэтому я звоню
SecPolicyCreateSSL(true, (CFStringRef)@"devhost.mydomain.tld");
и тогда цепочка сертификатов может быть успешно проверена.