Comportamiento de CRL y OCSP de iOS / Security.Framework?

Estoy tratando de averiguar qué política de iOS es cuando verifico certificates usando Security.Framework con respecto a la revocación de certificates. No puedo encontrar información sobre esto en los documentos para iOS. En el context de un proyecto de iPad en el que estoy trabajando en este momento, hay razones para exigir el estado de revocación de cheques para algunos certificates. ¿Alguna idea sobre cómo forzar la comprobación de CRL / OCSP durante la verificación de certificates utilizando Security.Framework? ¿O debo "retroceder" a OpenSSL para lograr esto?

Parece que también en Mac OS X 10.6, las verificaciones de CRL / OCSP se realizan opcionalmente y deben activarse manualmente a través de Keychain Access.

Martijn

Tengo una respuesta a esta pregunta por los chicos de Apple, publiqué la respuesta completa aquí:

Detalles sobre los mecanismos de revocación de certificates SSL / TLS en iOS

Para resumir, hay varias cosas a tener en count para la implementación de OCSP en iOS:

  • La política de OCSP no se puede configurar en este momento.
  • Solo funciona para los certificates EV.
  • elementos de alto nivel, como NSURLConnection o UIWebView, utilizan la política de security TLS, que utiliza OCSP
  • SecTrustEvaluate es una operación de networking de locking
  • funciona el "mejor bash": si no se puede contactar con el server OCSP, la evaluación de confianza no fallará

Acabo de hacer esto en iOS en GCDAsyncSocket.

Para una confianza de SecTrustRef dada; hacer esto

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

// editar para verificar trustResultType

Pude habilitar CRL para verificar un object SecTrustRef en 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 

Llamar a SecTrustSetNetworkFetchAllowed fue key. Sin esa llamada, SecTrustEvaluate devolvió kSecTrustResultUnspecified .