为OS X上导入到钥匙串的X509 CA证书添加信任

时间:2011-06-28 20:44:35

标签: objective-c cocoa security macos keychain

最近,我编写了一小段代码,用于从SCEP服务器获取CA证书,将其转换为SecCertificateRef并将其添加到钥匙串(系统或登录)。现在我想知道如何让系统信任该证书。我一直在玩信托政策,但我还没有太多运气。

除此之外,我了解系统可能不允许您在没有用户交互的情况下自动信任证书。如果是这样的话,你如何开始互动呢?使用“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 :(得分:0)

有一个很好的示例,说明如何在Citrix web site上使用大量示例代码执行此操作。