首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SecCertificateCreateWithData始终返回null

SecCertificateCreateWithData始终返回null
EN

Stack Overflow用户
提问于 2016-10-20 21:17:24
回答 4查看 6K关注 0票数 4

我目前正在使用下面的post。代码如下:

代码语言:javascript
复制
    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);

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

EN

回答 4

Stack Overflow用户

发布于 2018-08-08 17:20:19

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

如果你有.CER或.CRT扩展,你必须找出它是用DER还是PEM编码的。(如果有.PEM或.DER扩展,就很清楚了。)

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

certificate.der)

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

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

certificate.crt)

  • In终端重命名回certificate.der

(

  1. certificate.der: openssl -> x509 -in certificate.crt -outform der -out crt

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

票数 14
EN

Stack Overflow用户

发布于 2016-10-20 21:25:19

如果您正在签入iOS版本10或更高版本,则SecCertificateCreateWithData将返回nil

iOS10中的安全框架发生了一些变化。要么是iOS10中的"SecCertificateCreateWithData“被破坏了,要么是方法变得更严格了。

看起来像窃听器。

你可以在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。对于包含在捆绑包中的单个证书,您可以使用Mac.

上的Keychain Access对其进行预转换

票数 5
EN

Stack Overflow用户

发布于 2016-10-20 21:27:27

试一下,

代码语言:javascript
复制
  NSData *data = [[NSData alloc]initWithBase64EncodedString:publicKeyString options:NSDataBase64DecodingIgnoreUnknownCharacters];


certs = SecCertificateCreateWithData(kCFAllocatorMalloc, (__bridge CFDataRef)data);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40155587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档