我目前正在使用下面的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);根据post,如果certs变量为NULL,则数据的格式不正确。我检查了上面的公钥,它确实是base64,所以我看不出为什么certs会是空的?
发布于 2018-08-08 17:20:19
证书可以有以下扩展名:.CER,.CRT,.DER,.PEM。它可以用两种方式编码: DER和PEM。这个apple方法只接受DER编码。
如果你有.CER或.CRT扩展,你必须找出它是用DER还是PEM编码的。(如果有.PEM或.DER扩展,就很清楚了。)
要检查当前编码,请将扩展名更改为DER并尝试读取它:
certificate.der)
如果您看到一个错误,它可能是PEM编码的证书,您需要将其更改为DER编码:
certificate.crt)
(
发布于 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对其进行预转换
发布于 2016-10-20 21:27:27
试一下,
NSData *data = [[NSData alloc]initWithBase64EncodedString:publicKeyString options:NSDataBase64DecodingIgnoreUnknownCharacters];
certs = SecCertificateCreateWithData(kCFAllocatorMalloc, (__bridge CFDataRef)data);https://stackoverflow.com/questions/40155587
复制相似问题