Как удалить сертификат из Mac Keychain через код? - PullRequest
2 голосов
/ 20 сентября 2011

Я просмотрел Ссылку на сертификат Apple и не вижу ничего об удалении сертификатов из цепочки для ключей.

Это разрешено?

Если так, то как? Если нет, то почему?

1 Ответ

5 голосов
/ 29 октября 2011

Сертификаты являются подтипом элементов цепочки для ключей, поэтому вы можете использовать SecKeychainItemDelete для их удаления. Чтобы предотвратить предупреждения компилятора, вам нужно явно привести SecCertificateRef к SecKeychainItemRef - обычный C не имеет языковой поддержки для подклассов.

SecCertificateRef certificate = ...;
OSStatus status = SecKeychainItemDelete((SecKeychainItemRef)certificate);
if (status) {
    // Handle error
}

Если вы нацелены на Mac OS 10.6 или более позднюю версию, вы также можете использовать более новый SecItemDelete API. В простейшем случае это не дает никаких преимуществ, но вы можете изменить аргумент запроса, чтобы удалить сразу несколько сертификатов или удалить сертификаты, не имея прямых ссылок на них.

SecCertificateRef certificate = ...;
NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
                       kSecClassCertificate, kSecClass,
                       [NSArray arrayWithObject:(id)certificate], kSecMatchItemList,
                       kSecMatchLimitOne, kSecMatchLimit,
                       nil];    
OSStatus status = SecItemDelete((CFDictionaryRef)query);
if (status) {
    // Handle error
}
...