You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenSSL -sign命令在CMD与PowerShell中执行结果不一致问题

问题根因

1. 待签名文件编码错误

你在PowerShell中使用Out-File -Encoding "UTF7"写入待签名文件toBeSigned.txt,而JWT规范要求待签名的header.payload拼接串使用UTF-8无BOM编码,CMD场景下生成的待签名文件是标准ASCII/UTF-8无BOM格式,两个场景下待签名的二进制内容本身就不一致,签名结果必然不同。

2. PowerShell旧版本管道的二进制流处理缺陷

PowerShell 5.1及更早版本的管道默认是文本导向的:当你把openssl dgst输出的二进制签名结果通过管道传给openssl enc时,PowerShell会先按系统默认编码将二进制流解码为字符串,再转成UTF-16LE编码传给下一个命令,直接篡改了原始签名的二进制数据。而CMD的管道直接透传二进制字节流,不会做额外编码转换,所以结果正确。

修复方案
  • 替换待签名文件写入逻辑,避免编码错误:
    把原来的$toBeSigned | Out-File -Encoding "UTF7" toBeSigned.txt -NoNewLine替换为以下代码,生成标准UTF-8无BOM的待签名文件:
    [System.IO.File]::WriteAllText('toBeSigned.txt', $toBeSigned, [System.Text.Encoding]::UTF8)
    
  • 避免用PowerShell管道传递openssl的二进制输出,改为临时文件中转:
    把最后一行签名+编码的命令拆分为两步:
    openssl dgst -sha256 -sign jwtRS256.key -out signature.bin toBeSigned.txt
    openssl enc -base64 -in signature.bin -A
    

如果使用PowerShell 7+,也可以直接配置$PSNativeCommandPreserveBytePipe = $true开启二进制管道透传,直接执行原有管道命令也能得到正确结果。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:45:03