Siempre EXC_BAD_ACCESS en SecTrustEvaluate

estoy usandoCódigo de ejemplo de Apple para evaluar un certificado X509. He modificado un poco para obtener un certificado de mi paquete (solo cambié el nombre del archivo).

Cuando ejecuto esto siempre se bloquea en la línea concomment 5 status = SecTrustEvaluate(myTrust, &trustResult);. Yo siempre consigoEXC_BAD_ACCESS ahí.

- (BOOL)validateCertificate
{
    NSString *thePath = [[NSBundle mainBundle] pathForResource:@"user_signed_cert" ofType:@"crt"];
    NSData *certData = [[NSData alloc]
                        initWithContentsOfFile:thePath];
    CFDataRef myCertData = (__bridge_retained CFDataRef)certData; //1
    SecCertificateRef myCert;
    myCert = SecCertificateCreateWithData(NULL, myCertData); //2
    SecPolicyRef myPolicy = SecPolicyCreateBasicX509(); //3
    SecCertificateRef certArray[1] = { myCert };
    CFArrayRef myCerts = CFArrayCreate(
                                       NULL, (void *)certArray,
                                       1, NULL);
    SecTrustRef myTrust;
    OSStatus status = SecTrustCreateWithCertificates(
                                                     myCerts,
                                                     myPolicy,
                                                     &myTrust); //4
    SecTrustResultType trustResult;
    if (status == noErr) {
        status = SecTrustEvaluate(myTrust, &trustResult); //5 }

        NSLog(@"Status: %d", status);
        //6 if (trustResult == kSecTrustResultRecoverableTrustFailure) {
    }

    if (myPolicy)
        CFRelease(myPolicy);
}

¿Alguien sabe qué está mal aquí?

¡Gracias por adelantado!

Actualización # 1: Lo he cambiado a lo siguiente pero nada cambia. Mismo EXC_BAD_ACCESS enSecTrustEvaluate().

NSMutableArray *temp = [[NSMutableArray alloc] init];
[temp addObject:certData];
OSStatus status = SecTrustCreateWithCertificates((__bridge CFArrayRef)temp, myPolicy, &myTrust);

Parece questatus está vacío despuésSecTrustCreateWithCertificates() pero no contiene un error.

¿Alguna otra sugerencia que está mal?

Actualización # 2: He intentado la solución mencionada a continuación y recibo siemprekSecTrustResultInvalid. Solo he cambiado la creación del certificado de CA para almacenar la clave privada enca.key porque al firmar la solicitud (client.csr) Recibí el siguiente mensaje de error:

Signature ok
subject=/CN=foo-by-ZeeCA
Getting CA Private Key
unable to load CA Private Key

Además tuve que cambiar el comando de solicitud de firma paraopenssl x509 -CA ca.pem -in client.csr -CAkey ca.key -req -set_serial 1 -out client.pem. (adicional-CAkey ca.key)

Luego, utilicé el código en la solución a continuación y agregué mis rutas del paquete. Además, he añadido un caso de cambio para el estado.

/*
 # CA
 openssl req -x509 -new -subj /CN=ZeeCA -keyout ca.key -nodes -set_serial 1 > ca.pem
 openssl x509 -outform DER -out ca.der -in ca.pem

 # create andsign client
 openssl req  -new -subj /CN=foo-by-ZeeCA -CAkey ca.key  -keyout client.key -nodes > client.csr
 openssl x509 -CA ca.pem -in client.csr -req -set_serial 1  -out client.pem

 # format for client identity import
 openssl pkcs12 -export -out client.12 -inkey client.key -in client.pem -CAfile ca.pem -password pass:1234

 # format for trust.
 openssl x509 -in client.pem -out client.der -outform der

 */

NSString *clientPath = [[NSBundle mainBundle] pathForResource:@"client" ofType:@"der"];

//NSString *thePath = @"XXXX/client.der";

NSData *certData = [[NSData alloc]
                    initWithContentsOfFile:clientPath];
CFDataRef myCertData = (__bridge_retained CFDataRef)certData; //1

assert(myCertData);

SecCertificateRef myCert;
myCert = SecCertificateCreateWithData(NULL, myCertData); //2

assert(myCert);

SecPolicyRef myPolicy = SecPolicyCreateBasicX509(); //3

NSArray * certArray = [NSArray arrayWithObject:(__bridge id)(myCert)];

SecTrustRef myTrust;
OSStatus status = SecTrustCreateWithCertificates(
                                                 (__bridge CFArrayRef)certArray,
                                                 myPolicy,
                                                 &myTrust); //4

NSString *caPath = [[NSBundle mainBundle] pathForResource:@"ca" ofType:@"der"];
NSData *caData = [[NSData alloc]
                  initWithContentsOfFile:caPath];
CFDataRef myCaData = (__bridge_retained CFDataRef)caData; 
SecCertificateRef myCA = SecCertificateCreateWithData(NULL, myCaData); 
assert(myCA);

NSArray * myCAs = [NSArray arrayWithObject:(__bridge id)(myCA)];

SecTrustResultType xxx = SecTrustSetAnchorCertificates(myTrust, (__bridge CFArrayRef)(myCAs));
if (xxx != noErr) {
    NSLog(@"SecTrustSetAnchorCertificates failed: %d", xxx);
}


SecTrustResultType trustResult;
if (status == noErr) {
    status = SecTrustEvaluate(myTrust, &trustResult); //5 }        
    NSLog(@"Status: %d", status);
}

if (myPolicy)
    CFRelease(myPolicy);

if (status == noErr) {
    status = SecTrustEvaluate(myTrust, &trustResult); //5 }

    switch (status) {
        case kSecTrustResultProceed: // 1
            NSLog(@"Proceed");
            break;
        case kSecTrustResultConfirm: // 2
            NSLog(@"Confirm");
            break;
        case kSecTrustResultUnspecified: // 4
            NSLog(@"Unspecified");
            break;
        case kSecTrustResultRecoverableTrustFailure:  // 5
            NSLog(@"TrustFailure");
            break;
        case kSecTrustResultDeny: // 3
            NSLog(@"Deny");
            break;
        case kSecTrustResultFatalTrustFailure: // 6
            NSLog(@"FatalTrustFailure");
            break;
        case kSecTrustResultOtherError: // 7
            NSLog(@"OtherError");
            break;
        case kSecTrustResultInvalid: // 0
            NSLog(@"Invalid");
            break;
        default:
            NSLog(@"Default");
            break;
    }        
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta