objective-c - 添加对导入到 OS X 上钥匙串(keychain)的 X509 CA 证书的信任

标签 objective-c cocoa security macos keychain

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

除此之外,我了解系统可能不允许您在没有用户交互的情况下自动信任证书。如果是这样的话,你如何开始互动呢?使用“SecCertificateAddToKeychain”将证书静默放入钥匙串(keychain)中。

旁注:我也尝试使用此代码支持 10.5。

感谢您的帮助!

编辑: 在研究了 Citrix 页面上的代码后,我想出了自己的函数。从我从 Citix 页面收集到的信息来看,这种方法具有破坏性。因此,如果证书已经在钥匙串(keychain)中并且已经有策略(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;
}

最佳答案

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

关于objective-c - 添加对导入到 OS X 上钥匙串(keychain)的 X509 CA 证书的信任,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6512865/

相关文章:

django - webfaction 上的电子商务 django 应用程序与 VPS/DS 与 EC2 等云服务器

iOS Core Data 获取新插入的、尚未保存的对象

php - 使用 AfNetworking 2 将数据发布到 PHP 时,带有 NSArray 的 NSDictionary 正在转换为元素数组

iphone - 对同一对象多次调用 -retain

php - Symfony 授予对 security.yml 中多个角色的路径访问权限

ios - iOS 应用程序中用于登录系统的标准程序是什么?

objective-c - 使 Objective C 程序响应 applescript

objective-c - 运行错误将我发送到我没有写的代码

ios - 无法将 NSData 转换为图片 iphone

macos - 如何将 NSData 转换为 NSString 十六进制字符串?