SecCertificateCreateWithData always returning null

时间:2016-10-20 13:17:24

标签: ios objective-c security

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?

4 个答案:

答案 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并尝试读取它:

  1. 重命名文件(certificate.crt-> certificate.der)
  2. 在终端中:openssl x509 -in certificate.der -inform der -text -noout

如果看到错误,则可能是PEM编码的证书,需要将其更改为DER编码:

  1. 重命名为crt(certificate.der-> certificate.crt)
  2. 在终端中:openssl x509 -in certificate.crt -outform der -out certificate.der

//来源:https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them

答案 2 :(得分:0)

尝试,

  NSData *data = [[NSData alloc]initWithBase64EncodedString:publicKeyString options:NSDataBase64DecodingIgnoreUnknownCharacters];


certs = SecCertificateCreateWithData(kCFAllocatorMalloc, (__bridge CFDataRef)data);

答案 3 :(得分:0)

来自documentation

  

SecCertificateCreateWithData

     

从证书的DER表示创建证书对象。

     

...

     

返回值

     

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

那么,您尝试使用的NSData可能不是DER格式?