这篇文章将通过一个具体的例子来说明使用OpenSSL数字签名与验证的过程。
场景: liumiao有一封写给Michael的信(txt文件),他把内容和一个签名文件放在一起寄给Machael,签名文件用于说明这个文件是liumiao提供的。
写信&对信的内容进行签名 事前准备准备名为messages的文件,其中保存着liumiao写给Michael的内容。
[root@liumiaocn ~]# mkdir sign [root@liumiaocn ~]# cd sign [root@liumiaocn sign]# echo -n "Hello ,this is greetings from liumiao" >messages [root@liumiaocn sign]# cat messages Hello ,this is greetings from liumiao[root@liumiaocn sign]# [root@liumiaocn sign]#生成签名用的私钥
因为需要使用私钥进行签名,所以这里首先生成一个私钥文件
[root@liumiaocn sign]# ls messages [root@liumiaocn sign]# openssl genrsa -out rsa_key.private Generating RSA private key, 2048 bit long modulus (2 primes) ..+++++ ...............+++++ e is 65537 (0x010001) [root@liumiaocn sign]# ls messages rsa_key.private [root@liumiaocn sign]#使用私钥文件对messages文件进行签名
使用刚刚生成的私钥文件使用md5算法对messages文件进行签名,签名后生成一个名为messages.sign的签名文件
[root@liumiaocn sign]# openssl dgst -md5 -out messages.sign -sign rsa_key.private messages [root@liumiaocn sign]# ls messages messages.sign rsa_key.private [root@liumiaocn sign]#验证签名 验证方式1: 使用私钥来验证签名文件
Michael收到信和签名文件之后,如果Michael也有私钥的话,可以使用私钥来验证签名文件,执行示例如下所示:
[root@liumiaocn sign]# openssl dgst -md5 -prverify rsa_key.private -signature messages.sign messages Verified OK [root@liumiaocn sign]#验证方式2: 使用公钥来验证签名
由于私钥的特殊性,注定不能得到广泛传播,而从私钥中生成的公钥进行签名的验证更加符合实际的使用情况。首先从私钥生成一个公钥:
[root@liumiaocn sign]# openssl rsa -pubout -in rsa_key.private -out rsa_key.public writing RSA key [root@liumiaocn sign]# ls messages messages.sign rsa_key.private rsa_key.public [root@liumiaocn sign]# cat rsa_key.public -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6XPTRGxvZK3RYgVjJ4XV W8PO0AJUJsoEmdrVO/WG5nuKtbDtyInNAjwN0saHi+3CAWr2A9u8k6j3Mopag1Pw Sh8SDhmE3y1bI1xL/5x4pm0+ZVtfa0ReyyNOX4IQUSYJe6IyS29y/5eMc970gmig 7VMgfr1KpV4oR4b5bmWXbNIOKORoorbhmtmLt+SPwuqO5EWJlwC6AT4p1JB1B8xB pfjz2dRRL4u16SxPfZeID6xDMIq14KBgCNVv9FdSw+6KSsWY3lj7nOGeoqJ3eW02 aD40wnezDLXounaNngDu62AItVdooglUlBNCqvYfpCEownrW1LRBh8hpOl6xf3PI 9QIDAQAB -----END PUBLIC KEY----- [root@liumiaocn sign]#
Michael获得此公钥则是比较简单和正常的事情,然后结合messages文件和签名文件即可进行签名的验证了,执行示例如下所示
[root@liumiaocn sign]# openssl dgst -md5 -verify rsa_key.public -signature messages.sign messages Verified OK [root@liumiaocn sign]#