objective-c - 具有管理员权限的用户无法将证书添加到系统钥匙串(keychain),MacOS

标签 objective-c macos certificate keychain certificate-authority

我正在尝试开发一个快速命令行工具,它将根 CA 安装到 MacOS 系统钥匙串(keychain)中。这是完成这项工作的代码块。

    SecCertificateRef certificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData);
    SecKeychainRef keychain = nil;
    OSStatus status = SecKeychainCopyDomainDefault(kSecPreferencesDomainSystem, &keychain);
    if(status != errSecSuccess)
    {
        // log the error
        return;
    }
    
    status = SecKeychainUnlock(keychain, 0, NULL, TRUE);
    if(status != errSecSuccess)
    {
        // log the error
        return;
    }

    status = SecTrustSettingsSetTrustSettings(certificate, kSecTrustSettingsDomainSystem, NULL);

    NSDictionary * addCertificateQuery = @{(id)kSecValueRef: (__bridge id)certificate,
                                           (id)kSecClass:    (id)kSecClassCertificate,
                                           (id)kSecAttrLabel: CERT_ATTRIBUTE_LABEL,
                                           (id)kSecUseKeychain: (__bridge id)keychain,
                                           (id)kSecReturnRef: @YES,
                                            };
    status = SecItemAdd((__bridge CFDictionaryRef)addCertificateQuery, NULL);

当以 root 身份使用 XCode 调试器时,证书会正确添加到系统钥匙串(keychain)中,但是当以 user 身份调试时(user 具有管理员权限)并在收到提示后出于某种原因具有管理员权限的用户的用户名和密码 SecItemAdd 返回错误 -61:errSecWrPerm(用户 没有写入权限)。

我一直试图找到一些文档来解释为什么会发生这种情况,但仍然没有任何线索。所以我的问题是:是否有特殊原因导致具有管理员权限的用户无法向系统添加证书? System 上的写入是否只保留给 root?

我也尝试过更改 /Library/Keychains/System.keychain 权限,但结果相同。

最佳答案

具有“admin”权限的用户仍然只是一个普通的非 root 用户,但允许以 root 身份执行某些操作,例如在“sudo”或 MacOS 授权提示下(这将启用证书添加,但需要用户提示并在/var/db/auth.db 的数据库中注册)。可以使用 AuthorizationExecuteWithPrivileges 弹出授权,一个很好的例子是“security execute-with-privileges”,它弹出身份验证并使用/usr/libexec/security_authtrampoline - 一个 Setuid 根二进制文件。

关于只为 root 保留的系统的写入是正确的,并且由于系统完整性保护 (SIP) 以及 MacOS(在 10.15 中)移动到只读挂载的根文件系统,情况变得更加复杂。前者 (SIP) 添加保护,如果没有适当的 com.apple.rootless.* 授权,您将无法修改文件,即使是 root,而后者(r/o mount ) 意味着没有什么(除了重新安装和/或持有系统安装程序权利)不会让你写任何东西。

您指定的修改/Library/keychains 中文件的“直接”方法将失败,因为请注意钥匙串(keychain)文件的所有权属于根。

以编程方式添加证书将需要 root 或 com.apple.private.system-keychain 权利(或其 sibling 之一 - 我忘记了 - 请参阅 http://newosxbook.com/ent.jl?ent=com.apple.private.system-keychain&osVer=MacOS13 以获得完整的权利列表)。

另请注意,弄乱钥匙串(keychain)可能会产生一些严重的影响。这是 macOS 的所有 secret 和圣洁的东西——根证书、密码、Apple ID 等——的地方。谨防。一旦安装了根 CA,它就可以被信任用于各种应用程序(在某种程度上,包括代码签名、网站代理,甚至更险恶的用途)。因此,它没有给任何用户提供一个很好的理由 - 因为没有提示的批处理操作可能会偷偷注入(inject)这样的 CA,并为恶意软件开辟途径。

引用资料:“*OS Internals, Volume III”,第 11 章对此进行了处理,第 6 章进行了授权。网站:newosxbook.com

关于objective-c - 具有管理员权限的用户无法将证书添加到系统钥匙串(keychain),MacOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67061076/

相关文章:

iphone - 在 iOS 应用程序中使用 .mdb 文件而不是 SQLite?

objective-c - 填充 NSString 不起作用

cocoa - NSTextView 子类 - A4 纸外观

macos - 尝试在MacOS中打开串行端口时,open(2)函数挂起

C# 使用 HTTPS 从 URL 读取 XML 文件。 (使用 godaddy 托管)(来自 ZerosSSL 的证书)

android - 果冻 bean 的客户端证书错误

objective-c - 在 NSClassFromString() 返回的类上调用类方法

iphone - 为什么设置 UISegmenteControl 或 UIBarButtonItem 的tintColor 会禁用按钮按下动画?

objective-c - "Cinch App"是怎么做到的呢?

certificate - 如何解码自签名证书