【发布时间】:2013-05-20 16:52:55
【问题描述】:
我想使用 dsa 密钥和 openssl 签署文件。 DGST(1) 手册页内容如下:
文件...
要消化的一个或多个文件。如果没有指定文件,则 使用标准输入。
对我来说,这意味着以下两个终端命令应该给出相同的结果,但它们没有。我通过od 管道输出,因为结果是二进制的。
-
在命令行指定文件
openssl dgst -dss1 -sign private_key.pem test_archive.zip | od -x 0000000 2c30 1402 e30d 9073 0059 0de7 f03e 8fd2 0000020 874b 5252 b025 8f44 1402 ed26 2f55 7fa4 0000040 f474 0426 1d44 787c ecd6 5059 921b 0000056 -
将文件输入到 openssl 命令中
openssl dgst -dss1 -sign private_key.pem < test_archive.zip | od -x 0000000 2c30 1402 2444 c3a5 f498 7bb8 3dfe 715d 0000020 e179 c5ad c0a5 2b16 1402 173b 692b 9d71 0000040 3970 c497 9994 9cbc 4cfd d642 62df 0000056
如您所见,两个输出并不相同,尽管在两种情况下应签名的文件是相同的。
为什么会这样?我在这里遗漏了什么明显的东西吗?
编辑
我在 FreeBSD 上使用 OpenSSL 版本 0.9.8y 2013 年 2 月 5 日,在 Mac OS X 10.7.5 上使用 0.9.8r 版本 2011 年 2 月 8 日,并观察两者的效果。
编辑 2 - 如何生成测试密钥
用于生成适当密钥的小 shell 脚本
#!/bin/bash
openssl=/usr/bin/openssl
${openssl} dsaparam 1024 < /dev/urandom > dsaparam.pem
${openssl} gendsa dsaparam.pem -out private_key.pem
${openssl} dsa -in private_key.pem -pubout -out public_key.pem
rm dsaparam.pem
我还在 CentOS 6 Linux 系统上使用 OpenSSL 版本 1.0.0-fips 进行了测试,结果显示出同样奇怪的行为。
编辑 3 - 测试了更多版本
2013 年 2 月 11 日新编译的 OpenSSL 版本 1.0.1e 也显示了这种行为。
【问题讨论】:
-
魔术!你确定私钥文件和数据文件都没有改变吗?
-
两个文件都在我的硬盘上,命令的两个变种一个接一个地直接执行。