4

一部のサービスを呼び出すために証明書が必要な IPhone 用のアプリケーションを開発しているため、これを実行してキーチェーンに証明書を追加しています。

 SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) certificadoData);
 NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
 [dictionary setObject:(__bridge id)kSecClassCertificate forKey:(__bridge id)kSecClass];
 [dictionary setObject:(__bridge id)(cert) forKey:(__bridge id<NSCopying>)(kSecValueRef)];
 OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dictionary, NULL);

このコードの前にすべての kSecClassIdentity をリストすると、結果はなしで、このコードの後に​​は 2 つの ID と 1 つの証明書が返されます。ID を使用しようとしたとき、一方は正しく機能していますが、もう一方は機能していません。SecItemAdd が 1 つの kSecClassCertificate に対して 2 つの kSecClassIdentity を作成するのはなぜですか? そして、どうすれば正しいものを特定できますか?

4

1 に答える 1

1

私はちょうどこの問題を解決しなければなりませんでした。私の研究から、問題は、ID の 1 つに秘密鍵が含まれ、もう 1 つに公開鍵が含まれていることです。

したがって、追加する必要があるIDを取得しようとしているとき

value: kSecAttrKeyClassPrivate / kSecAttrKeyClassPublic
key: kSecAttrKeyClass

例でフィルターとして使用される辞書にSecItemCopyMatching:

NSMutableDictionary *filterDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                             (__bridge id)kSecClassIdentity, kSecClass,
                                             kSecMatchLimitAll,              kSecMatchLimit,
                                             kCFBooleanTrue,                 kSecReturnRef,
                                             kSecAttrKeyClassPrivate,        kSecAttrKeyClass,
                                             nil];
于 2015-05-15T15:36:48.873 に答える