1

CN によって証明書を削除する簡単な方法 (証明書は、PKCS12 インポートから SecItemAdd によって以前にそこに配置されています)。エラーが発生しています:

フォーマットのプロパティ リストが無効です: 200 (プロパティ リストに「SecIdentity」タイプのオブジェクトを含めることはできません)

https://developer.apple.com/documentation/security/1395547-secitemdeleteに基づく場合、次の指示に従っていると思います。

一時的な参照によって識別されたアイテムを削除するには、SecItemCopyMatching または SecItemAdd 関数への以前の呼び出しで kSecReturnRef 戻り型キーを使用して返された参照で kSecMatchItemList 検索キーを指定します。

手紙に。以下のコード:

NSDictionary * attributes;
NSString * cnString = @"/CN=foo";

attributes = [NSDictionary dictionaryWithObjectsAndKeys:
              (__bridge id)(kSecClassIdentity), kSecClass,
              cnString, kSecMatchSubjectContains,
              kSecMatchLimitAll, kSecMatchLimit,
              kCFBooleanTrue, kSecReturnRef,
              nil];

CFArrayRef result;
status = SecItemCopyMatching((__bridge CFDictionaryRef)(attributes), 
      (CFTypeRef *)&result);

if (status == noErr) {

    for(int i = 0; i < CFArrayGetCount(result); i++) {

        SecIdentityRef item = (SecIdentityRef) CFArrayGetValueAtIndex(result, i);
        NSLog(@"Item #%d: %@", i, item);

        attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                      (__bridge id)(kSecClassIdentity), kSecClass,
                      [NSArray arrayWithObject:(__bridge id)item], kSecMatchItemList,
                      kSecMatchLimitOne, kSecMatchLimit,
                      nil];

        status = SecItemDelete((__bridge CFDictionaryRef)(attributes));

        if (status != noErr || status != errSecItemNotFound)
            NSLog(@"Delete %d/%@failed: %ld (ignored)", i,item, status);
    };
};

コンソールの出力は次のとおりです。

 Item #0: <SecIdentityRef: 0xc7359ff0>

検索の直後 (検索範囲を広げると、これらの配列が得られます)。

そして、Security.dylib の奥深くから:

フォーマットのプロパティ リストが無効です: 200 (プロパティ リストに「SecIdentity」タイプのオブジェクトを含めることはできません)

最終的に保釈するには:

 Delete 0/<SecIdentityRef: 0xc7359ff0>failed: -50 (ignored)

私は何を間違っていますか?

4

2 に答える 2

0

これは、最新のGMドロップで修正されています。現実は現在、ドキュメントと同期しています。

于 2012-07-16T13:59:46.007 に答える