我想使用 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
我还在使用 OpenSSL 版本 1.0.0-fips 的 CentOS 6 Linux 系统上进行了测试,它显示了相同的奇怪行为。
编辑 3 - 测试了更多版本
2013 年 2 月 11 日新编译的 OpenSSL 版本 1.0.1e 也显示了这种行为。