Я использую NSURLConnection
для подключения к серверу с подстановочным сертификатом TLS (например, «* .domain.com»), а когда я вызываю SecTrustEvaluate
в свой NSURLConnectionDelegate
метод -connection:willSendRequestForAuthenticationChallenge:
, сертификат отклоняется как недопустимый. Принимается другой сервер, имеющий полностью определенный сертификат TLS (например, «server2.domain.com»). Оба сертификата выдаются одним и тем же ЦС, и я добавил сертификат ЦС в список доверенных сертификатов моего устройства.Почему сертификат SSL подстановки моего сервера отклоняется?
Я вижу такое же поведение в Safari на моем iPhone/iOS 8.1. Сервер с подстановочным сертификатом сообщается как имеющий ненадежный сертификат, в то время как другой сервер работает нормально. Таким образом, похоже, что проверка сертификата по умолчанию для iOS отменяет сертификаты подстановочных знаков. Это так?
Есть ли способ сообщить SecEvaluateTrust
, чтобы разрешить сертификаты подстановочных знаков? Вот отрывок из моего -connection:willSendRequestForAuthenticationChallenge:
- (void)connection:(NSURLConnection *)connection
willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge.protectionSpace.authenticationMethod
isEqualToString:NSURLAuthenticationMethodServerTrust]) {
SecTrustRef trust = [challenge.protectionSpace serverTrust];
SecTrustResultType trustResult;
OSStatus status = SecTrustEvaluate(trust, &trustResult);
if (status == noErr) {
if (trustResult == kSecTrustResultProceed
|| trustResult == kSecTrustResultUnspecified) {
// Success. server2 gets here
} else {
// Server authentication failure. server1 gets here
}
}
}
}
EDIT Андроида версии нашего программного обеспечения принимает групповые сертификаты просто отлично, так что я подозреваю, что есть что-то конкретное для обработки IOS свидетельства, что происходит здесь. Клиент Android использует BrowserCompatHostnameVerifier
для проверки сертификата, который, насколько я понимаю, выполняет ту же функцию, что и SecPolicyCreateSSL
, - выполняет ту же проверку в сертификате, который делает браузер.
Хорошо, сертификат содержит имя «* .domain.com» в разделе темы в качестве общего имени. В разделе «Альтернативное имя субъекта» перечисляется множество IP-адресов. Я посмотрю, смогу ли я заставить наших парней серверов создать сертификат, в котором будет указано имя подстановочного знака в разделе SAN. – Greg
Добавление подстановочного знака в раздел «Имя альтернативного имени», похоже, исправлено. Благодаря! – Greg