5

サーバーと安全に通信するために 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 関数は証明書参照を返し、nil ではありません...つまり、クラッシュの原因ではありません..何が間違っていますか。

*** -[NSCFType count]: unrecognized selector sent to instance 0x14af24
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***      -[NSCFType count]: unrecognized selector sent to instance 0x14af24'
4

1 に答える 1

4

SecTrustCreateWithCertificates単一の証明書または配列のいずれかを渡すことができるという主張のドキュメント。受け取っている例外には、-[NSCFType count]: unrecognized selector sent to instance. 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)適切な範囲で覚えておいてください。

于 2011-02-17T03:01:14.710 に答える