Переопределение имени хоста проверки сервера 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");

и тогда цепочка сертификатов может быть успешно проверена.

Другие вопросы по тегам