Подтвердить что ты не робот

CRL и OCSP поведение iOS/Security.Framework?

Я пытаюсь выяснить, что такое политика iOS при проверке сертификатов с использованием Security.Framework относительно отзыва сертификатов. Я не могу найти информацию об этом в документах для iOS. В контексте проекта iPad, над которым я сейчас работаю, есть основания требовать проверки статуса отзыва для некоторых сертификатов. Любые идеи о том, как принудительно проверять CRL/OCSP во время проверки сертификата с помощью Security.Framework? Или мне нужно "отступить" в OpenSSL, чтобы выполнить это?

Кажется, что и в Mac OS X 10.6 проверки CRL/OCSP выполняются дополнительно и должны быть включены вручную через доступ к Keychain.

Мартейн

4b9b3361

Ответ 1

У меня есть ответ на этот вопрос от Apple, я написал полный ответ здесь:

Сведения о механизмах аннулирования сертификатов SSL/TLS в iOS

Подводя итог, есть несколько вещей, которые следует учитывать при реализации OCSP в iOS:

  • Политика OCSP не может быть настроена в данный момент
  • он работает только для сертификатов EV
  • высокоуровневые материалы, такие как NSURLConnection или UIWebView, используют политику безопасности TLS, которая использует OCSP
  • SecTrustEvaluate - это операция блокировки сети.
  • он работает с "лучшей попыткой" - если с сервером OCSP невозможно связаться, проверка доверия не потерпит неудачу.

Ответ 2

Я только что сделал это на iOS в GCDAsyncSocket.

Для определенного доверия SecTrustRef; сделайте это

SecPolicyRef policy = SecPolicyCreateRevocation(kSecRevocationOCSPMethod)
SecTrustSetPolicies(trust, policy);
SecTrustResultType trustResultType = kSecTrustResultInvalid;
OSStatus status = SecTrustEvaluate(trust, &trustResultType);
if (status == errSecSuccess && trustResultType == kSecTrustResultProceed)
{
   //good!
}
else
{
   //not good
}

//редактируем для проверки trustResultType

Ответ 3

Мне удалось включить проверку CRL для объекта SecTrustRef на iOS 10:

SecTrustRef trust = ...; // from TLS challenge
CFArrayRef oldPolicies;
SecTrustCopyPolicies(trust, &oldPolicies);
SecPolicyRef revocationPolicy = SecPolicyCreateRevocation(kSecRevocationCRLMethod);
NSArray *newPolicies = [(__bridge NSArray *)oldPolicies arrayByAddingObject(__bridge id)revocationPolicy];
CFRelease(oldPolicies);
SecTrustSetPolicies(trust, (__bridge CFArrayRef)newPolicies);
SecTrustSetNetworkFetchAllowed(trust, true);

// Check the trust object
SecTrustResult result = kSecTrustResultInvalid;
SecTrustEvaluate(trust, &result);
// cert revoked -> kSecTrustResultRecoverableTrustFailure

Вызов SecTrustSetNetworkFetchAllowed был ключевым. Без этого вызова SecTrustEvaluate вернул kSecTrustResultUnspecified вместо этого.