首先,您必须 base64 将您的 NSString 解码为 NSData:请参阅此答案以获取解决方案。如果你正在为 iOS 7 开发,你可以使用initWithBase64EncodedString::options
.
将字符串解码为 NSData 后,您可以尝试从中创建证书。您收到的证书格式很重要 - 您可以使用 DER(很常见)或 PKCS12。您很可能将其作为 DER,所以我认为您需要指导。
创建证书和策略:
SecCertificateRef cert = NULL;
SecPolicyRef policy = NULL;
cert = SecCertificateCreateWithData(kCFAllocatorDefault, data);
policy = SecPolicyCreateBasicX509();
如果证书数据在传递给SecCertificateCreateWithData
您时格式不正确,则会得到 NULL 结果。
此时您拥有证书,但没有公钥。要获取公钥,您必须创建信任引用并评估证书的信任度。
OSStatus status = noErr;
SecKeyRef *publicKey = NULL;
SecTrustRef trust = NULL;
SecTrustResultType trustType = kSecTrustResultInvalid;
if (cert != NULL){
SecCertificateRef certArray[1] = {cert};
certs = CFArrayCreate(kCFAllocatorDefault, (void *)certArray, 1, NULL);
status = SecTrustCreateWithCertificates(certs, policy, &trust);
if (status == errSecSuccess){
status = SecTrustEvaluate(trust, &trustType);
// Evaulate the trust.
switch (trustType) {
case kSecTrustResultInvalid:
case kSecTrustResultConfirm:
case kSecTrustResultDeny:
case kSecTrustResultUnspecified:
case kSecTrustResultFatalTrustFailure:
case kSecTrustResultOtherError:
break;
case kSecTrustResultRecoverableTrustFailure:
*publicKey = SecTrustCopyPublicKey(trust);
break;
case kSecTrustResultProceed:
*publicKey = SecTrustCopyPublicKey(trust);
break;
}
}
}
如果一切顺利,您现在应该拥有一个包含公钥的 SecKeyRef。如果进展不顺利,您将有一个 NULL SecKeyRef 和一个 OSStatus 指示出了什么问题。SecBase.h
安全框架中提供了有关这些错误代码的更详细信息。
现在您有了一个带有公钥的 SecKeyRef,编程指南很好地介绍了使用它来使用相应的私钥加密数据。
请注意,您必须使用 ARC 或 CFRelease 释放您在上面分配的内容(策略、证书)。