使用OpenSSL实现证书操作
伴随着计算机的发展,计算机的安全问题也一直困扰着我们,在现代社会计算机信息安全更显得格外的重要,如今的社会是一个信息的社会,你我每天都在使用计算机,随着电子邮件、社区网游、即使通讯、电子商务等应用的发展,我们的私人信息也在通过各种网络设备在互联网上被传递,如何才能保障这些私人信息的安全是我们所要关心的。
对重要的数据如银行帐号我们可以使用加密技术加密我们的数据,然后再通过网络传递这些信息,现代加密技术通常被分为:对称加密技术和对对称加密技术。
其中对称加密技术的特点是:
1.加密与解密使用的是同一把钥匙;
2.由加密密钥可以推到出解密密钥,有解密密钥同样可以推断出加密密钥;
3.数据加密速度相对非对称加密技术较快。
非对称加密技术的特点是:
1.加密与解密使用两把不同的钥匙;
2.通过加密密钥不可能(有效时间内)推到出解密密钥,由解密密钥也不可能(有效时间内)推到出加密密钥;
3.与对称加密技术相比数据加密速度较慢。
注:公钥用来加密,私钥用来解密,公钥可以公开到互联网上被任何人使用,因为通过公钥无法推导出私钥。
由此我们可能很快就会判断我们需要对称加密技术加密我们在互联网中的数据,因为她简单且速度很快。如果你真的选择了这种解决方案,你会发现另外的一个非常严重的问题。即:如果互联网上通讯双方要想彼此通讯的话,就必须要提起协商一个加密与解密的密钥才可以,那么你的密钥要如何通过网络传递出去呢?如果使用加密传递出去,但是对方并不知道解密的方法,如果使用明文传递密钥,而此时正好有一名黑客通过互联网监听你的信息,那么这名监听者同样获得了以的密钥,这不是很可怕!
此时我们的一个合理的解决方案是:使用;非对称加密技术加密我们准备使用的对称加密的密钥,即:使用非对称加密技术的公钥加密我们准备要使用的对称加密技术的密钥,对方收到后再使用私密解密,这样双方都有了对称加密的密钥,快速的加密我们的数据,而加密真是数据用的非常重要的密钥;由于是使用非对称加密技术传输的所以也同样的安全!
到此我们的问题好像是都解决了,我们先假设一个环境:爱丽丝现在需要和鲍勃通过网络沟通公司的机密信息。按照我们知道的,爱丽丝现在需要一把密钥加密公司的机密文件,而鲍勃如果想打开该文件的话同样需要这把密钥。于是爱丽丝生成了一把对称加密技术的密钥,用来加密公司数据文件,同时为了让鲍勃可以阅读该文件,爱丽丝需要鲍勃生成一对非对称的公钥和私钥密钥对,鲍勃把自己的公钥发给爱丽丝,于是爱丽丝使用鲍勃发来的公钥加密了自己用来加密公司文件的对称密钥,同时把使用对称加密技术加密后的文件发给了鲍勃,鲍勃接受到文件后,先使用自己的私钥解密;爱丽丝的用于机密公司文件的密钥,然后使用解密除了的密钥;解密公司文件。看上去很完美!
如何在互联网上有一名不怀好意者,他自己也生成了一对非对称密钥,或偷取了鲍勃的非对称密钥,并把公钥发给爱丽丝,并声称自己是鲍勃,结果会怎么样呢?
很显然,我们没有办法知道互联网上某个公钥或私钥是否就是该持有人的真实身份。证书就是用来建立持有人与证书直接关系的技术。就想我们的身份证,身份证对应你本人,你本人同样对应这唯一的身份证,如果有谁怀疑的话,可以去公安机关去证实这个身份证的真伪!(完美)
要想使用证书我们这里需要几个关键因素:
1.验证机构(CA认证机构),这里CA是一个权威的机构。
2.实体个人(私钥,仅个人持有)
3.验证机制。
流程:个人生成密钥对,用户把自己的信息与公钥一起发给CA机构验证,申请属于自己的证书,当证书通过申请后即可在互联网上使用该证书。
OpenSSL提供了建立证书所需要的所有命令:req命令是证书申请工具。ca命令用于接受证书请求、审核证书请求、签发证书、吊销证书等管理证书的工具命令。
下面我们分别来看看这两个命令的使用:
一、证书请求:req
req [options] infile outfile
where options are
-inform arg input format - DER or PEM (输入证书请求文件的格式,DER或PEM格式,输入证书请求文件的目的是验证证书或显示证书内容)
-outform arg output format - DER or PEM (输出证书请求或自签名证书编码格式)
-in arg input file (输入一个已经存在的证书请求文件,可以配合x509选择生成自签名证书)
-out arg output file (输出文件名,可以输出证书请求、自签名证书、公钥等)
-text text form of request (输出证书请求或自签名根证书的明文内容,默认情况下将输出所有的明文信息)
-pubkey output public key (输出公钥到out选项指定的文件中)
-noout do not output REQ (不输出任何信息到文件)
-verify verify signature on REQ (对证书请求的数字签名进行验证)
-modulus RSA modulus
-nodes don't encrypt the output key (不加密输出的密钥)
-engine e use engine e, possibly a hardware device (使用第三方设备加密设备)
-subject output the request's subject (输出主机名信息)
-passin private key password source (读取私钥文件所需要的口令)
-key file use the private key contained in file (指定一个已存在的私钥文件)
-keyform arg key file format (指定密钥文件格式)
-keyout arg file to send the key to (私钥输出文件名)
-rand file:file:... (随机数文件)
load the file (or the files in the directory) into
the random number generator
-newkey rsa:bits generate a new RSA key of 'bits' in size (生成新的密钥,RSA代表使用RSA算法对密钥进行加密,bits表示密钥长度)
-newkey dsa:file generate a new DSA key, parameters taken from CA in 'file' (生成新的密钥,DSA代表使用DSA算法对密钥进行加密,bits表示密钥长度)
-[digest] Digest to sign with (md5, sha1, md2, mdc2, md4) (使用信息摘要算法,一般在数字签名时使用)
-config file request template file. (指定证书请求时所需的OpenSSL配置文件)
-subj arg set or modify request subject (通过命令行输入用户信息)
-multivalue-rdn enable support for multivalued RDNs
-new new request. (执行新的证书请求操作)
-batch do not ask anything during request generation (生成证书请求时不提示输入任何信息)
-x509 output a x509 structure instead of a cert. req. (输出x509结构的自签名根证书)
-days number of days a certificate generated by -x509 is valid for. (x509证书的有效期)
-set_serial serial number to use for a certificate generated by -x509. (设置x509证书的序列号)
-newhdr output "NEW" in the header lines (在证书请求行首输入NEW字段)
-asn1-kludge Output the 'request' in a format that is wrong but some CA's
have been reported as requiring
-extensions .. specify certificate extension section (override value in config file) (特殊的证书扩展字段)
-reqexts .. specify request extension section (override value in config file) (特殊的证书请求的扩展字段)
-utf8 input characters are UTF8 (default ASCII) (输入utf8编码的字符,默认是ASCII编码)
-nameopt arg - various certificate name options
-reqopt arg - various request text options
案例:
1.openssl req -key privkey.pem -passin pass:111111 -new -out request.pem
使用一个已存在的密钥生成证书请求文件(注:privkey是已存在的私钥文件,111111是该私钥的口令,关于如何生成非对称密钥对,你可以查看博客中的其他文章)
2.openssl req -newkey rsa:1024 -keyout privekey.pem -passout pass:111111 -out request.pem
生成一份新的1024位的私钥privekey.pem,再使用该私钥生成一份证书请求文件request.pem。
3.openssl req -new -x509 -key privekey.pem -passin pass:11111 -out cert.cer
使用已存在的密钥privekey.pem,生成一份自签名的根证书cert.cer。
*********************************************************************************************************
二、证书管理命令:CA
usage: ca args
-verbose - Talk alot while doing things (输出操作过程的详细信息)
-config file - A config file (指定OpenSSL配置文件)
-name arg - The particular CA definition to use (指定配置文件中的CA配置字段)
-gencrl - Generate a new CRL (生成一份CRL(证书吊销列表))
-crldays days - Days is when the next CRL is due (CRL有效期,天)
-crlhours hours - Hours is when the next CRL is due (CRL有效期,小时)
-startdate YYMMDDHHMMSSZ - certificate validity notBefore (证书生效日期)
-enddate YYMMDDHHMMSSZ - certificate validity notAfter (overrides -days) (证书到期日期)
-days arg - number of days to certify the certificate for (证书有效天数)
-md arg - md to use, one of md2, md5, sha or sha1 (使用信息摘要算法)
-policy arg - The CA 'policy' to support (指定匹配字段)
-keyfile arg - private key file (指定用于签发证书请求的私钥文件)
-keyform arg - private key file format (PEM or ENGINE) (私钥格式)
-key arg - key to decode the private key if it is encrypted (指定私钥口令)
-cert file - The CA certificate (指定用于签发证书请求的证书文件)
-selfsign - sign a certificate with the key associated with it (自签名证书)
-in file - The input PEM encoded certificate request(s) (指定要输入的证书请求文件)
-out file - Where to put the output file(s) (输出签发好的证书或生成的CRL文件)
-outdir dir - Where to put output certificates (证书或CRL的输出目录)
-infiles .... - The last argument, requests to process (作为最后一个选项使用,指定多个证书请求文件,而不是前面in选项指定的一个证书请求文件)
-spkac file - File contains DN and signed public key and challenge (包括DN和公钥的证书请求文件)
-ss_cert file - File contains a self signed cert to sign (自签名证书)
-preserveDN - Don't re-order the DN (不重新对证书主体名称的内容进行排序)
-noemailDN - Don't add the EMAIL field into certificate' subject (去除证书请求中的Email信息)
-batch - Don't ask questions (不提示输入信息而直接签发证书)
-msie_hack - msie modifications to handle all those universal strings
-revoke file - Revoke a certificate (given in file) (吊销一份证书文件)
-subj arg - Use arg instead of request's subject (重新填写证书请求的用户信息)
-utf8 - input characters are UTF8 (default ASCII) (输入utf8格式编码文件)
-multivalue-rdn - enable support for multivalued RDNs
-extensions .. - Extension section (override value in config file) (使用扩展字段)
-extfile file - Configuration file with X509v3 extentions to add (使用扩展字段)
-crlexts .. - CRL extension section (override value in config file)
-engine e - use engine e, possibly a hardware device.
-status serial - Shows certificate status given the serial number (显示证书状态)
-updatedb - Updates db for expired certificates (更新证书库数据)
案例:
1.openssl ca -in request.pem -out cert.cer
使用前面req生成的证书请求文件作为输入,签发一份证书文件(cert.cer)
2.openssl ca -revoke cert.cer
吊销一份证书文件
3.openssl ca -updatedb
更新证书数据库
本文转自丁丁历险51CTO博客,原文链接:http://blog.51cto.com/manual/788691 ,如需转载请自行联系原作者