到目前为止我尝试了什么:
// load all the filesNSData* fileData = [NSData dataWithContentsOffile:(...)];NSData* signatureData = [NSData dataWithContentsOffile:(...)];NSData* certificateData = [NSData dataWithContentsOffile:(...)]; SecCertificateRef certificate = SecCertificateCreateWithData(NulL,CFBrIDgingRetain(certificateData)); // load the certificate
证书加载就好了.它的名字可以使用
CFStringRef certificateDescription = SecCertificatecopySubjectSummary(certificate);
哪个有效.
由于iOS上似乎没有直接复制公钥的方法,我首先创建一个信任.
SecTrustRef trust;Osstatus statusTrust = SecTrustCreateWithCertificates( certificate,secPolicy,&trust);SecTrustResultType resultType;Osstatus statusTrustEval = SecTrustEvaluate(trust,&resultType);
这一切都可以正常使用errSecSuccess结果.
现在我尝试获取公钥.
SecKeyRef publicKey;publicKey = SecTrustcopyPublicKey(trust);size_t keysize = SecKeyGetBlockSize(publicKey);
但是publicKey的内容
NSData* keyData = [NSData dataWithBytes:publicKey length:keysize];
与打开.cer文件时看到的公钥不同.所以这是第一个问题.
然后我尝试验证签名,即使我知道公钥是错误的.填充是正确的.
Osstatus verficationResult = SecKeyRawVerify(publicKey,kSecpaddingPKCS1,[fileData bytes],[fileData length],[signatureData bytes],[signatureData length]);
这失败,Osstatus为-9809( *** 作无法完成).我希望它是-25293 errSecAuthFailed.
我做了一些根本错误的事吗?
解决方法 我在 a hint from Apple Dev Forums的帮助下解决了这个问题.这个问题与钥匙串无关.但我将错误的参数传递给验证功能.它需要数据的摘要(哈希),而不是数据直接.
NSData* fileData = [NSData dataWithContentsOffile:(...)];NSData* signatureData = [NSData dataWithContentsOffile:(...)];NSData* certificateData = [NSData dataWithContentsOffile:(...)]; SecCertificateRef certificateFromfile = SecCertificateCreateWithData(NulL,(__brIDge CFDataRef)certificateData); // load the certificateSecPolicyRef secPolicy = SecPolicyCreateBasicX509();SecTrustRef trust;Osstatus statusTrust = SecTrustCreateWithCertificates( certificateFromfile,&resultType);SecKeyRef publicKey = SecTrustcopyPublicKey(trust);uint8_t sha1HashDigest[CC_SHA1_DIGEST_LENGTH];CC_SHA1([fileData bytes],sha1HashDigest);Osstatus verficationResult = SecKeyRawVerify(publicKey,kSecpaddingPKCS1SHA1,sha1HashDigest,CC_SHA1_DIGEST_LENGTH,[signatureData length]);CFRelease(publicKey);CFRelease(trust);CFRelease(secPolicy);CFRelease(certificateFromfile);if (verficationResult == errSecSuccess) NSLog(@"VerifIEd");总结
以上是内存溢出为你收集整理的iOS:使用证书和签名验证文件 – 公钥错误,验证失败全部内容,希望文章能够帮你解决iOS:使用证书和签名验证文件 – 公钥错误,验证失败所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)