Добавление доверия для сертификата X509 CA, импортированного в цепочку для ключей на OS X - PullRequest
2 голосов
/ 29 июня 2011

Недавно я написал небольшую часть кода, которая берет сертификат 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;
}

1 Ответ

0 голосов
/ 29 июня 2011

Прекрасный пример того, как это сделать, можно найти на веб-сайте Citrix с тонной примера кода.

...