Immer EXC_BAD_ACCESS bei SecTrustEvaluate

ich benutzeApples Beispielcode zur Bewertung eines X509-Zertifikats. Ich habe ein wenig geändert, um ein Zertifikat aus meinem Bundle zu erhalten (nur den Dateinamen geändert).

Wenn ich das starte stürzt es immer in der Zeile mit abcomment 5 status = SecTrustEvaluate(myTrust, &trustResult);. Ich bekomme immer eineEXC_BAD_ACCESS Dort.

- (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);
}

Weiß jemand, was hier falsch läuft?

Danke im Voraus!

Update Nr. 1: Ich habe es folgendermaßen geändert, aber es ändert sich nichts. Gleiche EXC_BAD_ACCESS aufSecTrustEvaluate().

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

Es scheint, dassstatus ist leer nachSecTrustCreateWithCertificates() enthält aber keinen Fehler.

Irgendwelche anderen Vorschläge, was ist falsch?

Update Nr. 2: Ich habe die unten genannte Lösung ausprobiert und erhalte immerkSecTrustResultInvalid. Ich habe nur die Erstellung des CA-Zertifikats geändert, um den privaten Schlüssel in zu speichernca.key denn bei der Unterzeichnung der Anfrage (client.csr) Ich habe folgende Fehlermeldung erhalten:

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

Außerdem musste ich den Befehl für die Signaturanforderung auf ändernopenssl x509 -CA ca.pem -in client.csr -CAkey ca.key -req -set_serial 1 -out client.pem. (hinzugefügt-CAkey ca.key)

Dann habe ich den Code in der folgenden Lösung verwendet und meine Pfade aus dem Bundle hinzugefügt. Zusätzlich habe ich einen Schalterkasten für den Status hinzugefügt.

/*
 # 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;
    }        
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage