openssl

下面我们来看一下如何使用 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

Pieces of Valuable Programming Knowledges