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

    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 变量为 NULL,则数据格式不正确。我检查了上面的公钥,它的确是base64,所以我看不出certs为什么为NULL?

最佳答案

证书可以有以下扩展名:.CER、.CRT、.DER、.PEM。它可以用两种方式编码:DER 和 PEM。该apple方法仅接受DER编码。

如果您有 .CER 或 .CRT 扩展名,则必须确定它是采用 DER 还是 PEM 编码进行编码的。 (如果有 .PEM 或 .DER 扩展名就很清楚了。)

要检查当前编码,请将扩展名更改为 DER 并尝试读取它:

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

  • 如果您看到错误,很可能是 PEM 编码的证书,您需要将其更改为 DER 编码:
  • 重命名回 crt (certificate.der -> certificate.crt)
  • 在终端: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

    关于ios - SecCertificateCreateWithData 总是返回 null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40155587/

    10-10 17:27