注意: 我估计openssl最开始是在linux下开发的。大家可以看一看在linxu下有这么一个文件:/dev/urandom, 在sparc下没有。这个文件有什么用?你可以随时找它要一个随机数。在加密算法产生key的时候,我们需要一颗种子:seed。这个seed就是找/dev/urandom要的那个随机数。那么在sparc下,由于没有这么一个设备,很多openssl的函数会报错:\解决方法是:在你的~/.profile里面添加一个变量$RANDFILE, 设置如下:
$RANDFILE=$HOME/.rnd
然后在$HOME下vi .rnd, 随便往里面乱输入一些字符,起码俩行。
很多openssl的函数都会把这个文件当seed, 除了openssl rsa, 希望openssl尽快修改这个bug.
如果用openssl做toolkit编程, 则有其他不太安全的解决方法。以后讲到openssl编程的章节会详细介绍。
先生成自己的私有密钥文件,比如叫server.key
openssl genrsa -des3 -out server.key 1024
genras表示生成RSA私有密钥文件,-des3表示用DES3加密该文件,1024是我们的key的长度。一般用512就可以了,784可用于商业行为了,1024可以用于军事用途了。
当然,这是基于现在的计算机的速度而言,可能没过几年1024是用于开发测试,2048用于一般用途了。
生成server.key的时候会要你输入一个密码,这个密钥用来保护你的server.key文件,这样即使人家偷走你的server.key文件,也打不开,拿不到你的私有密钥。
openssl rsa -noout -text -in server.key
可以用来看看这个key文件里面到底有些什么东西(不过还是看不懂)
如果你觉得server.key的保护密码太麻烦想去掉的话:
openssl rsa -in server.key -out server.key.unsecure
不过不推荐这么做
下一步要得到证书了。得到证书之前我们要生成一个Certificate Signing Request.
CA只对CSR进行处理。
openssl req -new -key server.key -out server.csr
生成CSR的时候屏幕上将有提示,依照其指示一步一步输入要求的信息即可.
生成的csr文件交给CA签名后形成服务端自己的证书.怎么交给CA签名?
自己去www.verisign.com慢慢看吧。
如果是自己玩下,那么自己来做CA吧。openssl有很简单的方法做CA.但一般只好在开发的时候或者自己玩的时候用,真的做出产品,还是使用正规的CA签发给你的证书吧
在你make install之后,会发现有个misc的目录,进去,运行CA.sh -newca,他会找你要CA需要的一个CA自己的私有密钥密码文件。没有这个文件?按回车创建,输入密码来保护这个密码文件。之后会要你的一个公司信息来做CA.crt文件。最后在当前目录下多了一个./demoCA这样的目录../demoCA/private/cakey.pem就是CA的key文件啦,
./demoCA/cacert.pem就是CA的crt文件了。把自己创建出来的server.crt文件copy到misc目录下,mv成newreq.pem,然后执行CA.sh -sign, ok,
得到回来的证书我们命名为server.crt.
看看我们的证书里面有些什么吧
openssl x509 -noout -text -in server.crt
玩是玩过了,openssl的指令繁多,就象天上的星星。慢慢一个一个解释吧。
OpenSSL 中文手册 之五 OpenSSL 简介-常用指令
2011-05-13 12:00 342人阅读 评论(0) 收藏 举报
openssl简介-指令 verify 用法:
openssl verify 【-CApath directory】 【-CAfile file】 【-purpose purpose】【-untrusted file】 【-help】 【-issuer_checks】 【-verbose】 【-】 【certificates】
说明:
证书验证工具。 [/b:258940505f]
选项
-CApath directory
我们信任的CA的证书存放目录。这些证书的名称应该是这样的格式: xxxxxxxx.0( xxxxxxxx代表证书的哈希值。 参看x509指令的-hash)
你也可以在目录里touch一些这样格式文件名的文件,符号连接到真正的证书。 那么这个xxxxxxxx我怎么知道怎么得到?x509指令有说明。 其实这样子就可以了:
openssl x509 -hash -in server.crt
-CAfile file
我们信任的CA的证书,里面可以有多个CA的证书。
-untrusted file
我们不信任的CA的证书。
-purpose purpose
证书的用途。如果这个option没有设置,那么不会对证书的CA链进行验证。
现在这个option的参数有以下几个: sslclinet sslserver nssslserver
smimesign
smimeencrypt
等下会详细解释的。
-help
打印帮助信息。
-verbose
打印出详细的操作信息。
-issuer_checks
打印出我们验证的证书的签发CA的证书的之间的联系。 要一次验证多个证书,把那些证书名都写在后面就好了。
验证操作解释:
S/MIME和本指令使用完全相同的函数进行验证。 我们进行的验证和真正的验证有个根本的区别:
在我们对整个证书链进行验证的时候,即使中途有问题,我们也会验证到最后,而真实的验证一旦有一个环节出问题,那么整个验证过程就告吹。 验证操作包括几个独立的步骤。
首先建立证书链,从我们目前的证书为基础,一直上溯到Root CA的证书.
如果中间有任何问题,比如找不到某个证书的颁发者的证书,那么这个步骤就挂。有任何一个证书是字签名的,就被认为是Root CA的证书。
寻找一个证书的颁发CA也包过几个步骤。在openssl0.9.5a之前的版本,如果一个证书的颁发者和另一个证书的拥有着相同,就认为后一个证书的拥有者就是前一个证书的签名CA.
openssl0.9.6及其以后的版本中,即使上一个条件成立,还要进行更多步骤的检验。包括验证系列号等。到底有哪几个我也没看明白。
得到CA的名称之后首先去看看是否是不信任的CA, 如果不是,那么才去看看是否是信任的CA. 尤其是Root CA, 更是必须是在信任CA列表里面。 现在得到链条上所有CA的名称和证书了,下一步是去检查第一个证书的用途是否和签发时候批准的一样。其他的证书则必须都是作为CA证书而颁发的。 证书的用途在x509指令里会详细解释。
过了第二步,现在就是检查对Root CA的信任了。可能Root CA也是每个都负责不同领域的证书签发。缺省的认为任何一个Root CA都是对任何用途的证书有签发权。 最后一步,检查整条证书链的合法性。比如是否有任何一个证书过期了?签名是否是正确的?是否真的是由该证书的颁发者签名的?
任何一步出问题,所有该证书值得怀疑,否则,证书检验通过。
如果验证操作有问题了,那么打印出来的结果可能会让人有点模糊。 一般如果出问题的话,会有类似这样子的结果打印出来:
server.pem: /C=AU/ST=Queensland/O=CryptSoft Pty Ltd/CN=Test CA (1024 bit) error 24 at 1 depth lookup:invalid CA certificate
第一行说明哪个证书出问题,后面是其拥有者的名字,包括几个字段。 第二行说明错误号,验证出错在第几层的证书,以及错误描述。 下面是错误号及其描述的详细说明,注意,有的错误虽然有定义, 但真正使用的时候永远不会出现。用unused标志. 0 X509_V_OK 验证操作没有问题
2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 找不到该证书的颁发CA的证书。
3 X509_V_ERR_UNABLE_TO_GET_CRL (unused) 找不到和该证书相关的CRL
4 X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 无法解开证书里的签名。
5 X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE (unused) 无法解开CRLs的签名。
6 X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 无法得到证书里的公共密钥信息。
7 X509_V_ERR_CERT_SIGNATURE_FAILURE 证书签名无效
8 X509_V_ERR_CRL_SIGNATURE_FAILURE (unused) 证书相关的CRL签名无效
9 X509_V_ERR_CERT_NOT_YET_VALID 证书还没有到有效开始时间
10 X509_V_ERR_CRL_NOT_YET_VALID (unused) 与证书相关的CRL还没有到有效开始时间 11 X509_V_ERR_CERT_HAS_EXPIRED 证书过期
12 X509_V_ERR_CRL_HAS_EXPIRED (unused) 与证书相关的CRL过期
13 X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 证书的notBefore字段格式不对,就是说那个时间是非法格式。 14 X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 证书的notAfter字段格式不对,就是说那个时间是非法格式。 15 X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD (unused) CRL的lastUpdate字段格式不对。
16 X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD (unused) CRL的nextUpdate字段格式不对
17 X509_V_ERR_OUT_OF_MEM
操作时候内存不够。这和证书本身没有关系。
18 X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
需要验证的第一个证书就是字签名证书,而且不在信任CA证书列表中。
19 X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 可以建立证书链,但在本地找不到他们的根??
: self signed certificate in certificate chain