在iOS中使用服务器验证证书链接

时间:2015-07-16 19:34:21

标签: iphone security ssl keychain trust

我必须使用针对服务器的根证书对证书链进行身份验证。我得到了服务器证书的NSData。 我们没有任何authenticationChallenge机制,需要使用NSData进行验证。 我如何实现这一点,因为SecTrustEvaluate总是返回kSecTrustResultRecoverableTrustFailure。

以下是我正在使用的代码: -

NSData *aServerCertificateData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ABC" ofType:@"cer"]]; // This will actually come from the server
NSString *aRootPath = [[NSBundle mainBundle] pathForResource:@"XYZ" ofType:@"pem"];
CFDataRef aRootCertData = (__bridge CFDataRef)[NSData dataWithContentsOfFile:aRootPath];
CFDataRef myCertData = (__bridge CFDataRef)aServerCertificateData;
SecPolicyRef myPolicy = SecPolicyCreateBasicX509();

            SecCertificateRef certArray[1] = {myCert};
            CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL);
            SecTrustRef myTrust;
            OSStatus status = SecTrustCreateWithCertificates(myCerts, myPolicy, &myTrust);

            SecCertificateRef rootCertRef[1] = {rootCert};
            CFArrayRef rootCerts = CFArrayCreate(NULL, (void *)rootCertRef, 1, NULL);

            status = SecTrustSetAnchorCertificates(myTrust, rootCerts);

            SecTrustResultType trustResult;
            if (status == noErr) {
                status = SecTrustEvaluate(myTrust, &trustResult);
                if (status == noErr) {
                    if (trustResult == kSecTrustResultRecoverableTrustFailure) {// 2
                        NSData *exceptions = (__bridge NSData *)(SecTrustCopyExceptions(myTrust)); // This always gets called

                        NSLog(@"Exceptions: %@", [NSPropertyListSerialization propertyListWithData:exceptions options:kNilOptions format:nil error:nil]);
                    }


                    publicKeyRef = SecTrustCopyPublicKey(myTrust);
                }
            }

0 个答案:

没有答案