SecCertificateCreateWithData始终返回null

use*_*610 3 security objective-c ios

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

    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);
Run Code Online (Sandbox Code Playgroud)

根据帖子,如果certs变量为NULL,则数据格式不正确。我检查了上面的公钥,它确实是base64,所以我看不出为什么certs会是NULL?

Mar*_*uch 6

证书可以具有以下扩展名:.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


Ron*_*ara 5

如果您使用的是iOS 10或更高版本,SecCertificateCreateWithData则将返回nil

iOS10中的安全框架中的某些更改。iOS10中的“ SecCertificateCreateWithData”已损坏或方法变得更加严格。

看起来像个错误。

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

也可以在这里阅读相关的gitHub帖子:https : //github.com/lionheart/openradar-mirror/issues/16045

编辑:

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

还要在此处检查文档是否相同:SecCertificateCreateWithData

SecCertificateCreateWithData返回的最常见原因nil 是数据不是有效的证书。一个普遍的问题是人们试图通过PEM格式证书,而 SecCertificateCreateWithData要求DER。如果使用文本编辑器打开证书,是否看到Base64?还是看到二进制的咕?如果您看到了Base64,则需要DER先将证书转换为二进制()格式,然后再传递给 SecCertificateCreateWithData。对于捆绑包中包含的单个证书,您可以使用Mac上的“钥匙串访问”对其进行预转换。