下面我们来看一下如何使用 openssl
这个命令行工具产生公钥/私钥密钥对,并且使用私钥对文件进行签名和使用公钥进行验证。
生成公钥/私钥密钥对
$ ssh-keygen -t ecdsa -C "foo@bar.cn"
如果想要使用其他签名方式如 RSA
进行签名,可以将上述命令中的ecdsa
替换成 rsa
。使用上述命令默认在 .ssh/
目录下生成两个文件。
~/.ssh/id_ecdsa:这是你的私钥,私钥信息不能被泄露,如果别人拿到了你的私钥,别人就可以伪装成你。
~/.ssh/id_ecdsa.pub:这是你的公钥,公钥可以被大众知晓,你可以将公钥发布在网站上,便于其他人使用公钥对文件进行验证操作,一般来说私钥默认为
chmod 600
,而公钥默认为chmod 644
。
生成PKCS8版本的公钥
一般用 openssl
工具生成的公钥( id_ecdsa.pub
)的格式并不是非常友好,如果你想要将你的公钥颁布在你的网站上以便于他人进行验证的话,可以使用另一种格式的公钥,使用以下命令生成 PKCS8
版本。
$ ssh-keygen -e -f ~/.ssh/id_ecdsa.pub -m PKCS8 > ~/.ssh/id_ecdsa.pub.pkcs8
使用私钥对文件进行签名
如果你有一个需要被签名的文件为 foo.txt
,可以使用以下命令对文件进行签名。
$ openssl dgst -sha256 -sign ~/.ssh/id_ecdsa foo.txt > foo.txt.sig
-sha256
代表你使用 sha256
来生成信息摘要,生成的签名保存在 foo.txt.sig
中,可以使用 hexdump
来查看签名的内容。
使用公钥对文件签名进行验证
在使用公钥对文件进行验证之前,你需要有 pkcs8
格式的公钥,及需要被验证的文件( foo.txt
)及该文件的签名( foo.txt.sig
),还需要指定与签名时相同的哈希算法( sha256
)来对文件进行验证。
$ openssl dgst -sha256 -verify ~/.ssh/id_ecdsa.pub.pkcs8 -signature foo.txt.sign foo.txt