Недавно я написал небольшую часть кода, которая берет сертификат CA с сервера SCEP, превращает его в SecCertificateRef и добавляет его в цепочку для ключей (либо System, либо login).Теперь мне интересно, как я могу заставить систему доверять этому сертификату.Я играл с трастовыми политиками, но мне пока не очень повезло.
Кроме того, я понимаю, что система может не позволить вам автоматически доверять сертификату без взаимодействия с пользователем.Если это так, как вы начинаете взаимодействие?Использование "SecCertificateAddToKeychain" помещает сертификат в цепочку ключей без уведомления.
Примечание: я пытаюсь также поддерживать 10.5 с этим кодом.
Спасибо за любую помощь!
Редактировать: после игры с кодом на странице Citrix я придумал свою собственную функцию.Из того, что я собрал со страницы Citix, этот метод разрушителен.Поэтому, если сертификат уже находится в цепочке для ключей и уже имеет политики (iChat и т. Д.), Они будут перезаписаны.Поскольку меня это не волнует в моем проекте, вот более простая версия, которую я придумал.
-(OSStatus) addCertificate: (CertificateWrapper *) cert trust:(BOOL) shouldTrust {
//keychain is a SecKeychainRef created with SecKeychainOpen
OSStatus result = SecCertificateAddToKeychain([cert certificate], keychain);
if((result == noErr || result == errKCDuplicateItem) && shouldTrust){
SecTrustSettingsDomain domains[3] = { kSecTrustSettingsDomainSystem, kSecTrustSettingsDomainAdmin, kSecTrustSettingsDomainUser};
for(int i = 0; i < 3; i++){
CFMutableArrayRef trustSettingMutArray = NULL;
trustSettingMutArray = CFArrayCreateMutable (NULL, 0, &kCFTypeArrayCallBacks);
result = SecTrustSettingsSetTrustSettings([cert certificate], domains[i], trustSettingMutArray );
if(result == noErr){
break;
}
}
}
return result;
}