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);
如果certs
variables为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格式?