口令来源管理
OpenSSL 命令的 -passin 与 -passout 支持多种口令来源:pass: 明文、env: 环境变量、file: 文件、fd: 文件描述符。明文写法会把口令留在命令行历史与进程列表里,只适合临时演示;运维脚本应使用后几种方式,让口令不经过命令行,并与文件权限、清理机制配合使用,减少泄漏面。
基本信息
| pass: | 口令直接写在命令里,会进入历史与进程列表,仅适合演示 |
|---|---|
| env: | 从环境变量读取,注意子进程继承与调试输出可能泄漏 |
| file: | 从文件读取,文件权限应为 600 |
| fd: | 从指定文件描述符读取,适合进程间安全传递 |
| 通用原则 | 口令只应在必要时存在于内存与受控文件,任务结束即清理 |
典型使用场景
- 脚本化签发与导出(P12、PKCS#8)时避免明文口令
- CI 流水线通过受保护变量把口令注入构建过程
- 排查「解密失败」:确认读到的口令与加密时一致且没有多余换行
- 清理旧系统遗留的口令文件并收紧权限
- 设计运维流程中的口令轮换与清理步骤
脚本中的安全用法
脚本中的安全用法
umask 077 && printf '%s' "$NEWPASS" > /run/ssl/p12.pass # 受控目录,权限受限
openssl pkcs12 -export -out site.p12 -inkey site.key -in site.crt -passout file:/run/ssl/p12.pass
P12PASS=$(cat /run/ssl/p12.pass) openssl pkcs12 -in site.p12 -info -noout -passin env:P12PASS
# 使用结束后立即清理
# rm -f /run/ssl/p12.pass口令来源对比
| 写法 | 暴露面 | 适用场景 |
|---|---|---|
| pass: | 命令行历史与进程列表 | 仅临时演示 |
| env: | 环境变量与子进程 | 脚本与 CI |
| file: | 文件权限不足时被读取 | 常规运维脚本 |
| fd: | 传递路径可控 | 进程间安全交互 |
口令文件放在内存盘或权限受限目录,任务结束后清理,避免长期驻留。同时注意换行符:用 echo 写入可能多出一个换行,导致读到的口令与预期不同,建议改用 printf 写入。
补充:交互式场景可以用 stdin 作为口令来源,适合人工操作且不留痕迹;批量任务更适合 file: 配合严格权限。无论哪种方式都要避免口令进入 shell 历史,必要时先关闭历史记录再执行敏感命令。