进程替换调用OpenSSL签名:zsh正常bash报错的问题
问题原因与解决办法
问题出在bash和zsh对进程替换与管道结合时的文件描述符生命周期处理逻辑不同:
- zsh会维持进程替换生成的文件描述符(比如
/dev/fd/63)的存活状态,直到openssl完成读取操作。 - bash则会在管道左侧的
echo "something to sign"执行完毕后,立即关闭进程替换对应的文件描述符。此时openssl才开始尝试读取这个fd,自然会抛出Could not read private key from /dev/fd/63的错误。
修复方案
方案1:改用here-string传递待签名内容
避免管道导致的文件描述符提前关闭,直接用here-string把内容传给openssl:
openssl dgst -binary -sha256 -sign <(echo "certificate to sign with") <<< "something to sign"
方案2:用子shell包裹openssl命令
通过子shell维持进程替换的文件描述符生命周期,确保openssl读取时fd仍可用:
echo "something to sign" | bash -c 'openssl dgst -binary -sha256 -sign <(echo "certificate to sign with")'
额外提醒:
openssl dgst -sign参数需要的是私钥文件,而非证书。如果你的实际输入是证书而非私钥,后续可能还会遇到签名失败的问题。
内容的提问来源于stack exchange,提问作者Hrafn
相关产品推荐
相关产品推荐

