2014-10-21 3 views
3

Я использую 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, - выполняет ту же проверку в сертификате, который делает браузер.

ответ

4

Поскольку вы также видите такое же поведение с Safari, это, вероятно, проблема сертификата или того, что вы ожидаете от сертификата. Пожалуйста, проверьте (или опубликуйте) сведения о сертификате и способах его доступа. Пример. Сертификат, содержащий только запись для *.example.com, будет соответствовать foo.example.com, но не example.com или bar.foo.example.com. Кроме того, любая информация об именах должна быть в разделе SAN (альтернативные имена субъектов), использование общего имени для этого обесценивается.

+0

Хорошо, сертификат содержит имя «* .domain.com» в разделе темы в качестве общего имени. В разделе «Альтернативное имя субъекта» перечисляется множество IP-адресов. Я посмотрю, смогу ли я заставить наших парней серверов создать сертификат, в котором будет указано имя подстановочного знака в разделе SAN. – Greg

+0

Добавление подстановочного знака в раздел «Имя альтернативного имени», похоже, исправлено. Благодаря! – Greg