Answers:
单独使用OpenSSH工具可能无法做到这一点。
但是使用OpenSSL工具可以很容易地完成。实际上,至少有两种方法可以做到这一点。在下面的示例中,~/.ssh/id_rsa
是您的私钥。
一种方法是使用dgst:
openssl dgst -sign ~/.ssh/id_rsa some-file
另一个正在使用pkeyutl:
openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file
这两个都将二进制签名写入标准输出。dgst带有一个-hex
选项,将打印文本表示形式,其中包含有关签名形式的一些详细信息。pkeyutl带有一个-hexdump
选项,它的作用不大。两者都将同时接受RSA和DSA密钥。我不知道输出的格式是什么。这两个命令产生不同的格式。我觉得pkeyutl比dgst更现代。
要验证这些签名:
openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file
和:
openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file
这里的问题是$PUBLIC_KEY_FILE
。OpenSSL无法读取OpenSSH的公钥格式,因此您不能仅使用id_rsa.pub
。您有几种选择,都不是理想选择。
如果您具有5.6或更高版本的OpenSSH版本,则可以执行以下操作:
ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem
它将公共密钥以PEM格式写入标准输出,OpenSSL可以读取。
如果您有私钥,并且它是RSA密钥,则可以从中提取公钥(我假设PEM编码的私钥文件包含公钥的副本,因为无法导出公钥从私钥本身),并使用:
openssl rsa -in ~/.ssh/id_rsa -pubout
我不知道是否有DSA。请注意,此方法需要私钥所有者的一些合作,后者必须提取公钥并将其发送给可能的验证者。
最后,您可以使用由称为Lars的小伙编写的Python程序将公钥从OpenSSH转换为OpenSSL格式。
@Tom的答案帮助我入门,但是并没有开箱即用。
这些命令将与:
使用pkeyutl
# openssl pkeyutl -sign -inkey ~/.ssh/id_sample -in $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl pkeyutl -verify -pubin -inkey pub -in $1 -sigfile $1.sig
Signature Verified Successfully
使用dgst
# openssl dgst -sign ~/.ssh/id_sample $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl dgst -verify pub -signature $1.sig $1
Verified OK
pkeyutl版本只能签名小型文件。尽管dgst可以对任意大文件进行签名,但是dgst在签署结果之前需要进行摘要。
验证那些签名 -更简单的解决方案:
确保签名文档相同的更简单方法是重新生成数字签名文件,然后使用diff检查两个签名文件是否相同。