-1

我尝试从保存在设备上的证书获取公钥或私钥。 我使用这种方法:从证书获取公钥/私钥

- (SecKeyRef)publicKeyFromFile:(NSString *)path 
{ 
    NSData * certificateData = [[NSData alloc] initWithData:[[NSFileManager defaultManager] contentsAtPath:path]]; 

    if (certificateData != nil && certificateData.bytes != 0) { 

     CFDataRef cfDataPath = CFDataCreate(NULL, [certificateData bytes], [certificateData length]); 
     SecCertificateRef certificateFromFile = SecCertificateCreateWithData(NULL, cfDataPath); 

     if (certificateFromFile) { 
      SecPolicyRef secPolicy = SecPolicyCreateBasicX509(); 
      SecTrustRef trust; 
      SecTrustCreateWithCertificates(certificateFromFile, secPolicy, &trust); 
      SecTrustResultType resultType; 
      SecTrustEvaluate(trust, &resultType); 
      SecKeyRef publicKeyObj = SecTrustCopyPublicKey(trust); 

      return publicKeyObj; 
     } 
    } 

    return nil; 
} 

有数据cfDataPath,但certificateFromFile永远是零...

有谁知道在哪里的问题?

+0

你的标签已经预示这个问题是关于iOS版。无需将其添加到问题标题中。 –

回答

0

苹果文档是指:

获取从钥匙扣公钥加密 提取密钥的SecKeyRef对象如果要使用现有的公共和您的钥匙串私钥,读证书,密钥和信托服务编程学习如何检索该密钥的SecKeychainItemRef对象的指南。 获得SecKeychainItemRef后,您可以将其转换为SecKeyRef以用于此API。 导入现有的公钥和私钥导入和导出公钥和私钥对比生成新的密钥复杂一些,因为常用的不同密钥格式的数量较多。 本例介绍如何导入和导出PEM(保密增强邮件)格式的密钥对。

了解更多:https://developer.apple.com/library/mac/documentation/Security/Conceptual/SecTransformPG/SigningandVerifying/SigningandVerifying.htmlhttps://developer.apple.com/library/mac/documentation/Security/Conceptual/CertKeyTrustProgGuide/01introduction/introduction.html#//apple_ref/doc/uid/TP40001358

试试这个:

-(BOOL)trustCertFromChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
SecTrustResultType trustResult; 
SecTrustRef trust = challenge.protectionSpace.serverTrust; 
OSStatus status = SecTrustEvaluate(trust, &trustResult); 

//DLog(@"Failed: %@",error.localizedDescription); 
//DLog(@"Status: %li | Trust: %@ - %li",(long)status,trust,(long)trustResult); 

if (status == 0 && (trustResult == kSecTrustResultUnspecified || trustResult == kSecTrustResultProceed)) { 

    SecKeyRef serverKey = SecTrustCopyPublicKey(trust); 

    NSString *certPath = [[NSBundle mainBundle] pathForResource:@"MYCert" ofType:@"der"]; 
    NSData *certData = [NSData dataWithContentsOfFile:certPath]; 
    SecCertificateRef localCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certData); 

    SecKeyRef localKey = NULL; 
    SecTrustRef localTrust = NULL; 
    SecCertificateRef certRefs[1] = {localCertificate}; 
    CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, (void *)certRefs, 1, NULL); 
    SecPolicyRef policy = SecPolicyCreateBasicX509(); 
    OSStatus status = SecTrustCreateWithCertificates(certArray, policy, &localTrust); 

    if (status == errSecSuccess) 
     localKey = SecTrustCopyPublicKey(localTrust); 

    CFRelease(localTrust); 
    CFRelease(policy); 
    CFRelease(certArray); 

    if (serverKey != NULL && localKey != NULL && [(__bridge id)serverKey isEqual:(__bridge id)localKey]) 
     return YES; 
    else 
     return NO; 
} 

//DLog(@"Failed: %@",error.localizedDescription); 

return NO; 
    } 

按照接受的答案的详细信息:Objective-C/C pulling private key (modulus) from SecKeyRef