我正在尝试使用 iOS 安全框架与我的服务器安全地通信。我有一个证书文件,可以从中获取公钥引用。这就是我正在做的事情。
NSString *certPath = [[NSBundle mainBundle] pathForResource:@"supportwarriors.com" ofType:@"cer"];
SecCertificateRef myCertificate = nil;
NSData *certificateData = [[NSData alloc] initWithContentsOfFile:certPath];
myCertificate = SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef)certificateData);
//got certificate ref..Now get public key secKeyRef reference from certificate..
SecPolicyRef myPolicy = SecPolicyCreateBasicX509();
SecTrustRef myTrust;
OSStatus status = SecTrustCreateWithCertificates(myCertificate,myPolicy,&myTrust);
SecTrustResultType trustResult;
if (status == noErr) {
status = SecTrustEvaluate(myTrust, &trustResult);
}
publicKey = SecTrustCopyPublicKey(myTrust);
上面的代码在 iPhone 上完美运行,并且我已经测试过了。我能够与我的服务器安全地通信。但是当我尝试在 iPad 上运行我的应用程序(2x 模式)时,上面的代码崩溃了。调试后,我发现 secTrustCreateWithCertificate 崩溃了,崩溃日志如下。我使用的证书对于 iPad 和 iPhone 都是相同的...上面的 secCertificateCreateWithData 函数返回一个证书引用并且不为零...所以那就是不是崩溃的原因..我做错了什么。
*** -[NSCFType count]: unrecognized selector sent to instance 0x14af24
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFType count]: unrecognized selector sent to instance 0x14af24'
最佳答案
SecTrustCreateWithCertificates
的文档声称您可以传递单个证书或数组。您收到的异常指出-[NSCFType count]:无法识别的选择器发送到实例
。 iOS 3.2 中发生的情况是,SecTrustCreateWithCertificates
将输入值视为 CFArray,而不首先检查它是否是单个 SecCertificateRef
。
要解决此问题,您可以执行类似于以下代码的操作:
SecCertificateRef certs[1] = { certificate };
CFArrayRef array = CFArrayCreate(NULL, (const void **) certs, 1, NULL);
if(SecTrustCreateWithCertificates(array, x509Policy, &trustChain) == errSecSuccess)
只需记住在适当的范围内使用CFRelease(array)
即可。
关于iphone - SecTrustCreateWithCertificates 在 iPad 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3996658/