-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

귀하의 태그는 이미이 문제는 아이폰 OS에 대해 나타냅니다. 질문 제목에 추가 할 필요가 없습니다. –

답변

0

애플 문서가 참조 : 기존 공공 및 키 체인에서 개인 키를 사용하는 경우

는 키 체인에서 공개 키 암호화 추출 키위한 SecKeyRef 객체를 취득, 인증서, 키 및 신탁 서비스 프로그래밍 읽기 해당 키에 대한 SecKeychainItemRef 개체를 검색하는 방법을 배우는 안내서입니다. 일단 SecKeychainItemRef를 얻으면이 API와 함께 사용할 수 있도록 SecKeyRef로 캐스트 할 수 있습니다. 기존 공개 키 및 개인 키 가져 오기 공용 키 및 개인 키 쌍을 가져오고 내보내는 것은 일반적으로 사용되는 여러 가지 키 형식의 수가 많아 새로운 키를 생성하는 것보다 다소 복잡합니다. 이 예제는 PEM (Privacy Enhanced Mail) 형식으로 키 쌍을 가져오고 내보내는 방법을 설명합니다.

더 읽기 : 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