如何用 openssl 生成RSA双密匙;签名证书;加密文件邮件

本文翻译至一位很牛X的法国密码学老教授 Eric,先在这里默默感谢他

 

网上已有好多关于openssl的帖子,但是基本上都很“实用”,只讲如何创建证书来用于数据的加密,如何你只需要这些,那么可以去  “流浪的脚步”的博客

http://blog.csdn.net/darkstar21cn/archive/2005/06/11/392492.aspx

 

如果你需要多了解点openssl的,继续看下去吧

 

openssl 的功能:

  * 生成RSA,DSA双密匙(还可以再给他们签名)

  * 生成X509 证书

  * 计算印章(MD5,SHA,,RIPEMD160)用于加密大文件

   *加密,解密 (算法有 DES, IDEA,RC2 , RC4, Blowfish...)

   *SSL 服务器端/客户端测试

   * 处理签名或加密了的邮件

 

假设你已经安装了openssl, 下面在我分点讲解,然后在每一点后面加一个例子

 

1.生成一对RSA密匙(非对称密匙,包含1个公共+一个私用),

 $ openssl genrsa -out  <fichier>  <taille>

 例子: openssl genrsa -out  maCle.pem 1024

 可以用查看我们的密匙

  $ cat maCle.pem

   

  用cat只看到了一些字符串,但我们完全不懂他的含义,openssl还提供了一个功能就是查看RSA

  如果研究过非对称加密的朋友,可以用这个命令看出这对密匙的生成参数: 2个大素数, 1个模等

   $ openssl rsa -in <fichier> -text -noout


   

 

 2.很多时候让刚刚生成的密匙以明码的形式存在是有危险的,所以openssl还提供了用对称加密法(DES, DES3等)加密RSA密匙的功能

 $ openssl rsa -in <RSA 密码 文件> -des3 -out <RSA 密码 文件>

 例子:


3. 刚才说过,RSA包含1个公共+一个私密匙,openssl提供将公用部分从密匙里提取出来,因为在跟对方交流时,对方只要你的公共部分就可以了,如果你的私有部分也被人知道了,那RSA加密的意义就失去了;

所以记住:RSA的私有密匙只能有你一个人知道,如果泄露了,得马上更新一对新的RSA 密匙

 $openssl rsa -in < RSA 密码 文件 > -pubout -out < RSA 公共密码 文件 >

 例子:

 

4.加密文件

 $openssl rasutl -encrypt -in <原始文件> -inkey < RSA 密码 文件> -out <输出文件>

或者只用公用密码加密

 $openssl rasutl -encrypt -in <原始文件> -inkey -pubin < RSA 公共 密码 文件> -out <输出文件>

 

5。解密的话只要将 -encrypt 改为 -decrypt就好,当然文件对象改变一下


6. 签名不只适合小文件,如果对大文件的话得引进印章(Message Digests). 先计算该文件的印章

 $ openssl dgst <hachage算法>  -out  <印章文件> <原始大文件>

 hachage算法有:

    * MD5  (-md5)

    * SHA1 (-sha1)

    * RPEMD160 (-ripemd160)

  然后要对该印章签名

  $ openssl rsautl -sign -in <印章文件>  -inkey < RSA 密码 文件> -out <签名文件>

 然后我们就可以将原始大文件+它的签名文件 发给对方了, 在对方可以用我们提供给他的RSA 公共 密码 文件 验证该文件,如果符合就说明是我们的文件;否则说明在传输过程中该文件已被人篡改过,不能相信这个文件内容


对方的验证方法:

先从受到的签名文件中获取“对方印章文件1

 $ openssl rsautl -verify  -in <签名文件> -pubin -inkey < RSA 公共 密码 文件 > -out <对方印章文件1>

然后从收到的原始大文件中用同样的hachage算法 算出另一个“对方印章文件2

 $ openssl dgst <hachage算法>  -out  <对方印章文件2> <原始大文件>

最后只要比较这两个获得的 对方印章文件1 ”与 对方印章文件2 ”是否完全相同,如果是就说明文件未必篡改

 $ diff < 对方印章文件1 > < 对方印章文件2 >

 

 

7.证书的创建

首先得建立一个证书申请请求:

 创建文件 req.cnf , 包含我们的个人信息

 

 

 $ openssl  req −configreq.cnf −new −key maCle . pem −out maRequete . pem

可以查看我们的申请文件

例子:

 

 

我们拥有了一个证书申请,还需要一个证书颁发机构CA来给你的申请签名,否则无效

一般情况下,个人可以自己来充当这个CA机构,只需再创建一个证书(大多数人是这样的);

教授提供了一个CA证书(应该具有一点定的权威性吧),大家可以下载复制保存一下

查看证书信息:

$ openssl x509 -in <证书.pem>  -text  -noout

 

pereUbuCertif.pem

 

PereUbuCle.pem

 

然后创建一个文件PereUbu.srl , 包含一行我们证书的序列号:

例如:

91:d6:18:dc:24:c0:a3:24

 

保存这个CA证书及它的密匙后,我们可以创建我们自己的证书了


$ openssl x509 -days 10 <有效时间>  -CAserial <序列号文件>  -CA <CA证书文件>  -CAkey <CA证书的密匙> -in <证书申请.pem>  -req  -out <证书.pem>

 

已经完成,现在我们可以来检查一下我们的证书是否有效

$ openssl verify -CAfile PereUbuCertif.pem monCertif.pem

 

8.介绍一下如何用获得的证书对自己的邮件签名发送到对方

 

假设: 我们邮件的内容保存在 blabla.txt 中, 那么我们可以用一行命令就可以发送该邮件并附上签名

 

  $ openssl smime -sign -in <邮件内容文件 blabla.txt>  -signer monCertif.pem -inkey maCle.pem -from <自己的邮箱地址>  -to <对方邮箱地址> -subject "邮件主题"

 

也可以用 -out  选项讲邮件内容输出到一个文件,然后通过邮箱操作发送

 

而作为接收邮件的一方,如何检查邮件内容是否被篡改呢?

$ openssl smime -verify -in <受到的签名邮件 courrier.signe> /

                                     -signer <邮件附件中的发送方的证书> /

                                      -CAfile <CA颁发机构的证书PereUbuCertif.pem>

 

每次发送,接收邮件都用命令,肯定是不方便的,所以我们可以讲我们的证书加载到浏览器中,这样就方便多了。 但是本人建议还是使用邮件桌面软件方便,比如说Ubuntu下自带的“Evolution邮件”支持自己的签名,只要导入证书稍微设置一番,以后发送签名邮件就更正常邮件一样方便,这里就不多介绍了

 

有错误的地方,希望大家指正

没有更多推荐了,返回首页