OpenSSL证书创建、验证及加解密过程总结

1.简介

1.1SSL

要了解OPENSSL,首先我们要了解SSLSSL最初是由美国网景 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保护的网页。

OpenSSL证书创建、验证及加解密过程总结_第1张图片

 

Https网页示例

SSL协议提供的服务主要有:

1)认证用户和服务器,确保数据发送到正确的客户机和服务器;

2)加密数据以防止数据中途被窃取;

3)维护数据的完整性,确保数据在传输过程中不被改变。

SSL协议工作方式:

服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

OpenSSL证书创建、验证及加解密过程总结_第2张图片

SSL 协议所提供的服务及其工作流程可以看出,SSL协议运行的基础是商家对消费者信息保密的承诺,这就有利于商家而不利于消费者。在电子商务初级阶段,由于运作电子商务的企业大多是信誉较高的大公司,因此这问题还没有充分暴露出来。但随着电子商务的发展,各中小型公司也参与进来,这样在电子支付过程中的单一认证问题就越来越突出。虽然在SSL3.0中通过数字签名和数字证书可实现浏览器和Web服务器双方的身份验证,但是SSL协议仍存在一些问题,比如,只能提供交易中客户与服务器间的双方认证,在涉及多方的电子交易中,SSL协议并不能协调各方间的安全传输和信任关系。在这种情况下,Visa MasterCard两大信用卡公组织制定了SET协议,为网上信用卡支付提供了全球性的标准。

SSL工作机制

OpenSSL证书创建、验证及加解密过程总结_第3张图片

1.2OpenSSL

OpenSSL是套开放源代码的SSL套件,其函式库是以C语言所写成,实作了基本的传输层资料加密功能。此软件是以EricYoung以及Tim Hudson两人所写的SSLeay为基础所发展的,SSLeay随着两人前往RSA公司任职而停止开发。1998年,OpenSSL项目组接管了OpenSSL的开发工作,并推出了OpenSSL0.9.1版,到目前为止,OpenSSL的算法已经非常完善,对SSL2.0SSL3.0以及TLS1.0都支持。ps: ericRSA公司做了一个叫SSL-Ctoolkit,类似openssl但是收费,而且几乎所有低层的函数都不提供直接调用了。

 OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。OpenSSL不仅仅是 SSL。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字。

2.OpenSSL实验

2.1实验环境

OS: Ubuntu 11.10

OpenSSL Version:1.0.0e 6 Sep 2011

2.2OpenSSL加密功能简介

使用命令行工具实验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为解密后的文件。

2.3证书的创建和验证

如果想使用 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

2.4使用证书对文件进行加解密

建立测试文件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

你可能感兴趣的:(Linux,信息安全)