CRL и OCSP поведение iOS/Security.Framework?
Я пытаюсь выяснить, что такое политика iOS при проверке сертификатов с использованием Security.Framework относительно отзыва сертификатов.
Я не могу найти информацию об этом в документах для iOS.
В контексте проекта iPad, над которым я сейчас работаю, есть основания требовать проверки статуса отзыва для некоторых сертификатов. Любые идеи о том, как принудительно проверять CRL/OCSP во время проверки сертификата с помощью Security.Framework? Или мне нужно "отступить" в OpenSSL, чтобы выполнить это?
Кажется, что и в Mac OS X 10.6 проверки CRL/OCSP выполняются дополнительно и должны быть включены вручную через доступ к Keychain.
Мартейн
Ответы
Ответ 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
вместо этого.