要了解OPENSSL,首先我们要了解SSL。SSL最初是由美国网景 Netscape Communication 公司设计开发的,全称为:安全套接层协议 (Secure Sockets Layer),它指定了在应用程序协议 (如 HTTP、 Telnet、 FTP)和 TCP/IP之间提供数据安全性分层的机制,它是在传输通信协议 (TCP/IP)上实现的一种安全协议,采用公开密钥技术,它为 TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。维基百科上对SSL这样描述:TheSecure Sockets Layer (SSL) is a commonly-used protocol for managing thesecurity of a message transmission on the Internet.
电子商务网站普遍使用了SSL。当看到HTTPS开头的URL和一个锁的图标时,表明我们正在访问一个受SSL保护的网页。
Https网页示例
SSL协议提供的服务主要有:
1)认证用户和服务器,确保数据发送到正确的客户机和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变。
SSL协议工作方式:
服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。
用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。
从SSL 协议所提供的服务及其工作流程可以看出,SSL协议运行的基础是商家对消费者信息保密的承诺,这就有利于商家而不利于消费者。在电子商务初级阶段,由于运作电子商务的企业大多是信誉较高的大公司,因此这问题还没有充分暴露出来。但随着电子商务的发展,各中小型公司也参与进来,这样在电子支付过程中的单一认证问题就越来越突出。虽然在SSL3.0中通过数字签名和数字证书可实现浏览器和Web服务器双方的身份验证,但是SSL协议仍存在一些问题,比如,只能提供交易中客户与服务器间的双方认证,在涉及多方的电子交易中,SSL协议并不能协调各方间的安全传输和信任关系。在这种情况下,Visa和 MasterCard两大信用卡公组织制定了SET协议,为网上信用卡支付提供了全球性的标准。
SSL工作机制
OpenSSL是套开放源代码的SSL套件,其函式库是以C语言所写成,实作了基本的传输层资料加密功能。此软件是以EricYoung以及Tim Hudson两人所写的SSLeay为基础所发展的,SSLeay随着两人前往RSA公司任职而停止开发。1998年,OpenSSL项目组接管了OpenSSL的开发工作,并推出了OpenSSL的0.9.1版,到目前为止,OpenSSL的算法已经非常完善,对SSL2.0、SSL3.0以及TLS1.0都支持。ps: eric在RSA公司做了一个叫SSL-C的toolkit,类似openssl但是收费,而且几乎所有低层的函数都不提供直接调用了。
OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。OpenSSL不仅仅是 SSL。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字。
OS: Ubuntu 11.10
OpenSSL Version:1.0.0e 6 Sep 2011
使用命令行工具实验OpenSSL的加密功能。
RSA生成一个密钥:
openssl genrsa -out test.key 1024
这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。
openssl可以将这个文件中的公钥提取出来:
openssl rsa -in test.key -pubout -outtest_pub.key
-in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥(包含公钥)。现在可以将用公钥来加密文件了。
在目录中创建一个hello的文本文件,然后利用此前生成的公钥加密文件:
openssl rsautl -encrypt -in hello -inkeytest_pub.key -pubin -out hello.en
-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。
解密文件:
openssl rsautl -decrypt -in hello.en -inkeytest.key -out hello.de
-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。
如果想使用 OpenSSL来生成证书请求和数字证书,那么必须创建一个配置文件。这里使用了一个参考的配置文件openssl.cnf。
创建CA:
1)创建CA私钥,可以使用选项-des3创建带加密口令的私钥文件,这样建立的私钥在建立时需要输入一个密码用来保护私钥文件,私钥文件使用3DES加密
$ openssl genrsa -outdemoCA/private/cakey.pem 1024
Generating RSA private key, 1024 bit longmodulus
..++++++
.....++++++
e is 65537 (0x10001)
2)创建CA自签名证书,按照提示输入CA信息,默认输出为pem格式
$ openssl req -config openssl.cnf -new-x509 -key demoCA/private/ca.key -out demoCA/certs/ca.crt
You are about to be asked to enterinformation that will be incorporated
into your certificate request.
What you are about to enter is what iscalled a Distinguished Name or a DN.
There are quite a few fields but you canleave some blank
For some fields there will be a defaultvalue,
If you enter '.', the field will be leftblank.
-----
CN []:cn
省份或直辖市名称[]:beijing
组织名 []:aoe
网站的全限定域名[]:www.zynet.mtn
3)查看创建的证书信息
$ openssl x509 -in demoCA/cacert.pem -noout-text -modulus
至此便可以使用该CA颁发证书了
创建用户证书:
1)创建一个用户的私钥
$ openssl genrsa -out u1privkey.pem 1024
2)创建证书签名请求,根据提示输入相关信息,challenge password可留空
openssl req -new -key u1privkey.pem -outu1csr.pem
用户私钥和证书签名请求可由用户在其他机器上自行生成
3)查看证书请求
openssl req -noout -text -modulus -inu1csr.pem
4)创建用户证书,新创建的证书会放置在newcerts目录下,若未带-out选项,可从newcerts目录下复制
openssl ca -config openssl.cnf -inu1csr.pem -out u1crt.pem
验证用户证书
$ openssl verify -CAfiledemoCA/certs/ca.crt server/server.crt
server/server.crt: OK
建立测试文件data,其中内容为:网络与信息安全控制技术
提取证书文件中的公钥信息:
$ openssl x509 -pubkey -inserver/server.crt -out server/server.pubkey
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYhJizzt4+zhLMTSjDk0rd6MlK
xBYKIp972+Wc9KSpOs5LGQ+2802mlr6dSDWJJhJShArqOIKgxNE7ZBZYlGeDo4l6
Dm4DyVFpu62fObgk6vmU8T7nvF8Uo7sQdpfqgUjofGFgUDjB3fYgKUTp+kOj6RMh
R3uttrZmOraF/rEUkQIDAQAB
-----END PUBLIC KEY-----
利用公钥信息对文件进行加密:
openssl rsautl -encrypt -in hello -inkeytest_pub.key -pubin -out hello.en
利用私钥信息解密文件:
openssl rsautl -decrypt -in hello.en -inkeytest.key -out hello.de