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

User with administrator privileges cannot add certificate to System Keychain, 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, 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 调试器时,证书被正确添加到系统钥匙串,但是当以 user 调试时(user 具有管理员权限)并且由于某种原因提示输入具有管理员权限的用户的用户名和密码后 SecItemAdd returns 错误 -61:errSecWrPerm(user[=23 没有写入权限=]).

我一直在努力寻找一些文档来解释为什么会发生这种情况,但仍然没有任何线索。所以我的问题是:是否有特殊原因导致具有管理员权限的用户无法向系统添加证书? 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) 意味着没有什么(除了重新安装,and/or 持有系统安装程序权利)不会让你写任何东西。

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

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

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

参考文献:“*OS Internals, Volume III”,第 11 章对此进行了处理,第 6 章进行了授权。网站:newosxbook.com