I'm currently working from the following post. Here is the code:
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);
Based on the post if the certs
variable is NULL then data was in an incorrect format. I checked the above public key and it is indeed base64, so I can't see why certs
would be NULL?
答案 0 :(得分:5)
如果您要检入iOS 10或更高版本,则SecCertificateCreateWithData
将返回nil
。
iOS10中的安全框架中发生了一些变化。要么" SecCertificateCreateWithData"在iOS10中被破坏或者方法变得更加严格。
看起来像个错误。
您可以在https://openradar.appspot.com/28618141
查看错误报告另请阅读相关的gitHub帖子:https://github.com/lionheart/openradar-mirror/issues/16045
<强> 编辑: 强>
来自此处的主题:Why SecCertificateCreateWithData is always return nil?
另请参阅此处的文档:SecCertificateCreateWithData
SecCertificateCreateWithData
返回nil
的最常见原因 是数据不是有效的证书。一个常见的问题是 人们尝试传递PEM
格式证书,而SecCertificateCreateWithData
需要DER
。如果你打开了 证书与文本编辑器,你看到Base64?或者你看到了吗? 二进制粘性?如果您看到Base64
,则需要转换证书 到传递给二进制(DER
)表单SecCertificateCreateWithData
。对于您的单一证书 包含在您的捆绑包中,您可以使用Keychain进行预转换 在Mac上访问。
答案 1 :(得分:3)
证书可以具有以下扩展名:.CER,.CRT,.DER,.PEM。它可以通过两种方式编码:DER和PEM。这个apple方法只接受DER编码。
如果您具有.CER或.CRT扩展名,则必须找出它是否以DER或PEM编码进行编码。 (如果有.PEM或.DER扩展名,则很清楚。)
要检查当前编码,请将扩展名更改为DER并尝试读取它:
如果看到错误,则可能是PEM编码的证书,需要将其更改为DER编码:
答案 2 :(得分:0)
尝试,
NSData *data = [[NSData alloc]initWithBase64EncodedString:publicKeyString options:NSDataBase64DecodingIgnoreUnknownCharacters];
certs = SecCertificateCreateWithData(kCFAllocatorMalloc, (__bridge CFDataRef)data);
答案 3 :(得分:0)
SecCertificateCreateWithData
从证书的DER表示创建证书对象。
...
返回值
新创建的证书对象。完成后调用CFRelease函数释放此对象。如果data参数中传递的数据不是有效的DER编码的X.509证书,则返回NULL。
那么,您尝试使用的NSData可能不是DER格式?