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

问题描述

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

    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,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);

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

我一直试图找到一些文档来解释为什么会发生这种情况,但仍然没有任何线索。所以我的问题是:具有管理员权限的用户无法向系统添加证书是否有特殊原因?在系统上写入是否仅保留给 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 二进制文件。

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

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

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

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

参考资料:“*OS Internals,Volume III”,第 11 章处理这个问题,第 6 章涉及授权。网站:newosxbook.com