SecCertificateCreateWithData总是返回null

我目前正在从以下职位工作 。 这里是代码:

SecCertificateRef certs = NULL; SecPolicyRef policy = NULL; NSString *publicKeyString = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeJ8N8fuGShAJnniDg4yuRrxrG61ZF2T24eXSEH87jCJmLbc+MV70AgP/LC8btzSU4FFP56lBmDcmW+Prupf5gO1RXhjPIlET73t5Ny1I3ze+xaShAA9qB0c9dNb26NxVd95wCHNmQhon9qBFmTVZb0CdgscxYcDuLOGskDnATrwIDAQAB"; NSData *publicKeyStringData = [[NSData alloc] initWithBase64EncodedString:publicKeyString options:0]; certs = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef) publicKeyStringData); 

如果certsvariables为NULL,则基于post,数据格式不正确。 我检查了上面的公钥,它确实是base64,所以我不明白为什么certs将是NULL?

如果您正在检查iOS版本10或更高版本,则SecCertificateCreateWithData将返回nil

在iOS10的安全框架中发生了一些变化。 在iOS10中“SecCertificateCreateWithData”被破坏,或者方法变得更加严格。

看起来像一个错误。

您可以在https://openradar.appspot.com/28618141查看错误报告

另请阅读相关的gitHubpost: https : //github.com/lionheart/openradar-mirror/issues/16045

编辑:

从这里的线程: 为什么SecCertificateCreateWithData总是返回零?

还请检查文档中的相同: SecCertificateCreateWithData

SecCertificateCreateWithData返回nil的最常见原因是数据不是有效的证书。 一个常见的问题是人们试图传入一个PEM格式的证书,而SecCertificateCreateWithData需要DER 。 如果您使用文本编辑器打开证书,您是否看到Base64? 或者你看到二进制黑客? 如果您看到Base64 ,则在传递给SecCertificateCreateWithData之前,需要将证书转换为二进制( DER )格式。 对于您包中包含的单个证书,您可以使用Mac上的“钥匙串访问”对其进行预先转换。

尝试,

  NSData *data = [[NSData alloc]initWithBase64EncodedString:publicKeyString options:NSDataBase64DecodingIgnoreUnknownCharacters]; certs = SecCertificateCreateWithData(kCFAllocatorMalloc, (__bridge CFDataRef)data); 

从文档 :

SecCertificateCreateWithData

从证书的DER表示创build一个证书对象。

返回值

新创build的证书对象。 调用CFRelease函数以在完成时释放此对象。 如果数据参数中传递的数据不是有效的DER编码的X.509证书,则返回NULL。

所以,你试图使用的NSData可能不是DER格式?