Salt macOS keychain 模块实战指南用 Salt 管理 macOS 钥匙串中的证书【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址: https://gitcode.com/gh_mirrors/sa/saltSalt 的keychain执行模块salt/modules/mac_keychain.py专门用于在 macOS 系统上向钥匙串Keychain安装、卸载、查询证书并可读取证书友好名称、获取默认钥匙串及证书哈希。本文以该模块源码为主体结合对应的 状态模块 与测试用例讲解每个函数的参数语义、底层security/openssl命令实现、典型 CLI 用法并给出可复制的 State SLS 配置帮助你在大规模 macOS 主机上自动化管理证书生命周期。模块概览与平台限制keychain模块自 Salt 2016.3.0 版本引入见 模块源码其设计目标非常聚焦向 macOS 钥匙串安装证书。该模块通过__virtual__钩子强制限制运行平台仅在salt.utils.platform.is_darwin()返回 True即 macOS时加载否则加载失败并返回提示 Only available on Mac OS systems with pipes。因此在 Linux/Windows 的 minion 上调用该模块不会生效源码。与之一一对应的状态模块 salt/states/mac_keychain.py 也采用同样的平台校验逻辑。从架构上看模块内所有函数均通过__salt__[cmd.run]调用 macOS 自带的security命令行工具或openssl本质是对系统工具链的轻量封装因此其行为与 macOS 原生security命令保持一致。证书安装keychain.installinstall函数用于向指定钥匙串安装证书源码核心命令为security import cert -P password -k keychain参数说明参数类型默认值说明certstr必填要安装的证书通常为.p12文件路径passwordstr必填证书口令格式遵循 openssl 的 PASS PHRASE ARGUMENTS 规范keychainstr/Library/Keychains/System.keychain证书安装到的目标钥匙串allow_anyboolFalse为 True 时追加-A参数允许任何应用无警告访问导入的证书keychain_passwordstrNone当目标钥匙串可能处于锁定状态时传入导入前会先执行解锁底层行为与安全提示若传入keychain_password函数会先调用unlock_keychain(keychain, keychain_password)解锁钥匙串再执行导入源码allow_anyTrue时命令追加-A源码对应 macOSsecurity import的 allow any application to access 语义模块文档与源码均明确警告password与keychain_password会以明文形式出现在 job 返回信息中[源码](https://link.gitcode.com/i/e197e26a1a8c510784d97840a762d485#L45-L46, L59-L60)在安全敏感环境需谨慎使用。CLI 用法salt * keychain.install test.p12 test123单元测试 tests/pytests/unit/modules/test_mac_keychain.py 验证了默认命令拼接为security import /path/to/cert.p12 -P passw0rd -k /Library/Keychains/System.keychain并在传入allow_anyTrue、keychain_password时先解锁再追加-A与源码逻辑完全一致。证书卸载keychain.uninstalluninstall根据证书名称从钥匙串删除证书源码底层命令为security delete-certificate -c cert_name keychaincert_name要删除的证书名称通常取自行keychain.get_friendly_name或keychain.list_certs的结果keychain目标钥匙串默认系统钥匙串keychain_password同样支持先解锁再删除文档中的 CLI 示例沿用了keychain.install源码注释存在笔误实际语义为删除证书。对应单元测试 tests/pytests/unit/modules/test_mac_keychain.py 验证命令为security delete-certificate -c /path/to/cert.p12 passw0rd。证书清单keychain.list_certslist_certs列出指定钥匙串中全部已安装证书源码底层使用管道命令security find-certificate -a keychain | grep -o alis.* | grep -o [ -A-Za-z0-9.:() ]*keychain参数会经shlex.quote转义后拼入命令避免路径中的特殊字符破坏命令结构输出会去除两侧引号并按行拆分最终返回证书名friendly name的列表该命令显式传入python_shellTrue因为它依赖 shell 管道源码。功能测试 tests/pytests/functional/modules/test_mac_keychain.py 验证系统钥匙串中应至少包含com.apple.systemdefault等默认证书。日常运维中list_certs常与installed/uninstalled状态配合做幂等判断。获取证书友好名称keychain.get_friendly_nameget_friendly_name读取给定.p12证书的友好名称friendlyName结果可用于后续的安装/卸载/哈希比对源码。openssl pkcs12 [-legacy] -in cert -passin pass:password -info -nodes -nokeys 2 /dev/null | grep friendlyName:cert.p12证书路径password证书口令legacy布尔参数默认False。由于 OpenSSL 3.0 起默认不再支持旧版加密算法需对旧格式证书追加-legacy标志源码输出会剥离friendlyName:前缀并去除两端空白后返回。功能测试 tests/pytests/functional/modules/test_mac_keychain.py 演示了版本适配逻辑当openssl version低于 3.0.0 时传legacyFalse否则传legacyTrue。该函数是状态模块实现幂等安装的关键依赖。默认钥匙串管理get_default_keychain 与 set_default_keychain这两个函数分别读取与设置指定域的默认钥匙串源码get_default_keychain(userNone, domainuser)执行security default-keychain -d domainuser参数通过runas传给cmd.run以指定执行用户set_default_keychain(keychain, domainuser, userNone)执行security default-keychain -d domain -s keychaindomain合法取值为user | system | common | dynamic默认user。单元测试 tests/pytests/unit/modules/test_mac_keychain.py 验证了runas与-s参数的透传逻辑。钥匙串解锁keychain.unlock_keychainunlock_keychain(keychain, password)执行security unlock-keychain -p password keychain用于在导入/删除证书前解除钥匙串锁定源码。该函数是install/uninstall在传入keychain_password时的内部依赖同样地密码会以明文出现在 job 返回信息中。证书哈希比对keychain.get_hashget_hash(name, passwordNone)返回钥匙串中证书的哈希用于判断已安装证书与待安装证书是否为同一实体源码。其实现按输入类型分支当name以.p12结尾时执行openssl pkcs12 -in name -passin pass:password -passout pass:password提取证书否则将name视为钥匙串中的证书名执行security find-certificate -c name -m -p输出 PEM 内容随后用正则-----BEGIN CERTIFICATE-----(.*)-----END CERTIFICATE-----DOTALL|MULTILINE捕获证书正文并返回匹配失败则返回False。在状态模块中该函数被用于同名但不同哈希的证书替换场景见下文。结合状态模块声明式证书管理与执行模块配套的 salt/states/mac_keychain.py 提供了三个状态函数可直接写入 SLSkeychain.installed幂等安装/mnt/test.p12: keychain.installed: - password: test123installed(name, password, keychain/Library/Keychains/System.keychain, **kwargs)源码的执行流程若name包含http或salt前缀先通过__salt__[cp.cache_file]将证书从 Salt fileserver 或远程 URL 缓存到本地状态测试 test_install_cert_salt_fileserver 验证了salt://path/to/cert.p12场景调用keychain.list_certs与keychain.get_friendly_name获取当前证书列表与友好名称若友好名称已存在则用keychain.get_hash对比文件哈希与钥匙串哈希哈希一致幂等返回 friendly_namealready installed.哈希不一致先卸载旧证书再安装新证书源码对应测试 test_installed_cert_hash_different若证书不存在则执行keychain.install根据输出中是否包含imported判定成功与否。keychain.uninstalled幂等卸载/mnt/test.p12: keychain.uninstalled: - password: test123uninstalled(name, password, keychain..., keychain_passwordNone)源码支持两种name输入.p12文件路径含salt:///http前缀时先缓存或证书友好名称本身对已不在列表中的证书返回 already uninstalled.。keychain.default_keychain设置默认钥匙串/path/to/chain.keychain: keychain.default_keychain: - domain: system - user: frankdefault_keychain(name, domainuser, userNone)源码会先校验os.path.exists(name)不存在则直接失败对应测试 test_default_keychain_missing已设置为默认时幂等返回否则调用set_default_keychain并根据输出长度判断是否成功。测试与验证如何确认模块行为仓库为keychain模块提供了三个层次的测试可作为理解与验证行为的第一手资料单元测试tests/pytests/unit/modules/test_mac_keychain.py通过MagicMock断言每个函数拼接出的security/openssl命令行精确到参数顺序与引号转义是学习底层命令格式的速查表功能测试tests/pytests/functional/modules/test_mac_keychain.py标注了slow_test、destructive_test、skip_if_not_root、skip_unless_on_darwin等标记使用真实.p12测试文件tests/integration/files/file/base/certs/salttest.p12完成安装、卸载、friendly name 读取与默认钥匙串查询的端到端验证并利用setup/teardown在测试后清理证书状态测试tests/pytests/unit/states/test_mac_keychain.py覆盖已安装/未安装/哈希不同/文件服务器缓存等状态机分支验证返回字典的result、comment、changes结构。使用前提与限制平台模块仅在 macOSDarwin上加载管理目标必须是 macOS minion系统工具security为 macOS 内置命令get_friendly_name/get_hash依赖opensslOpenSSL 3.0 处理旧证书需legacyTrue功能测试在缺少openssl时会被跳过tests/pytests/functional/modules/test_mac_keychain.py权限操作系统钥匙串/Library/Keychains/System.keychain通常需要 root 权限功能测试因此标记了skip_if_not_root明文密码password与keychain_password会出现在 job 返回信息与日志中属于模块文档明确提示的安全注意事项应在不敏感环境或配合机密管理系统如 Salt Pillar eauth使用。【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址: https://gitcode.com/gh_mirrors/sa/salt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考