SSL 笔记

  • SSL协议:

广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输.它位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。

SSL协议可分为两层:

SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。

SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

 

  • 任务:

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

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

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

 

  • 过程:

服务器认证阶段:

1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;

2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;

3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;

4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

 

用户认证阶段:经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

 

补充:

1.密钥交互过程:非对称

 

2.

 

 

  • 缺点:

只能提供交易中客户与服务器间的双方认证,在涉及多方的电子交易中,SSL协议并不能协调各方间的安全传输和信任关系。为此,就有了SET协议。

 

二、

利用openssl产生ssl证书:

OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程

此生成的证书可用于浏览器、java、tomcat、c++等。在此备忘!

 

1.创建根证私钥

命令:

openssl genrsa -out root-key.key 1024

 

2.创建根证书请求文件

命令:

openssl req -new -out root-req.csr -key root-key.key -keyform PEM

 

3.自签根证书

命令:

openssl x509 -req -in root-req.csr -out root-cert.cer -signkey root-key.key -CAcreateserial -days 3650

 

4.导出p12格式根证书

命令:

openssl pkcs12 -export -clcerts -in root-cert.cer -inkey root-key.key -out root.p12

 

5.生成root.jks文件

keytool -import -v -trustcacerts -storepass 123456 -alias root -file root-cert.cer -keystore

root.jks

 

生成客户端文件:

1.生成客户端key

openssl genrsa -out client-key.key 1024

2.生成客户端请求文件

openssl req -new -out client-req.csr -key client-key.key

3.生成客户端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书)

openssl x509 -req -in client-req.csr -out client-cert.cer -signkey client-key.key -CA root-cert.cer

-CAkey root-key.key -CAcreateserial -days 3650

4.生成客户端p12格式根证书

openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12

 

客户端jks:

keytool -import -v -trustcacerts -storepass 123456 -alias client -file client-cert.cer -keystore

client.jks

 

生成服务端文件:

1.生成服务端key

openssl genrsa -out server-key.key 1024

2.生成服务端请求文件

openssl req -new -out server-req.csr -key server-key.key

3.生成服务端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书)

openssl x509 -req -in server-req.csr -out server-cert.cer -signkey server-key.key -CA root-cert.cer

-CAkey root-key.key -CAcreateserial -days 3650

4.生成服务端p12格式根证书

openssl pkcs12 -export -clcerts -in server-cert.cer -inkey server-key.key -out server.p12

服务端JKS

keytool -import -v -trustcacerts -storepass 123456 -alias server -file server-cert.cer -keystore

server.jks

 

无密码key命令:

openssl rsa -in client-key.key -out client-key.key.unsecure

 

三、

代码举例

网站:

ssl原理:http://iluoxuan.iteye.com/blog/1736275

ssl编程:http://blog.csdn.net/xs574924427/article/details/17240793

 

客户端流程:

客户端(相对于CA)在申请证书的时候,大体上有三个步骤:

第一步:生成客户端的密钥,即客户端的公私钥对,且要保证私钥只有客户端自己拥有。

 

第二步:以客户端的密钥和客户端自身的信息(国家、机构、域名、邮箱等)为输入,生成证书请求文件。其中客户端的公钥和客户端信息是明文保存在证书请求文件中的,而客户端私钥的作用是对客户端公钥及客户端信息做签名,自身是不包含在证书请求中的。然后把证书请求文件发送给CA机构。

 

第三步:CA机构接收到客户端的证书请求文件后,首先校验其签名,然后审核客户端的信息,最后CA机构使用自己的私钥为证书请求文件签名,生成证书文件,下发给客户端。此证书就是客户端的身份证,来表明用户的身份。

 

举例说明:

至此客户端申请证书流程结束,其中涉及到证书签发机构CA,CA是被绝对信任的机构。如果把客户端证书比作用户身份证,那么CA就是颁发身份证的机构,我们以https为例说明证书的用处。

 

为了数据传输安全,越来越多的网站启用https。在https握手阶段,服务器首先把自己的证书发送给用户(浏览器),浏览器查看证书中的发证机构,然后在机器内置的证书中(在PC或者手机上,内置了世界上著名的CA机构的证书)查找对应CA证书,然后使用内置的证书公钥校验服务器的证书真伪。如果校验失败,浏览器会提示服务器证书有问题,询问用户是否继续。

 

例如12306网站,它使用的自签名的证书,所以浏览器会提示证书有问题,在12306的网站上有提示下载安装根证书,其用户就是把自己的根证书安装到用户机器的内置证书中,这样浏览器就不会报证书错误。但是注意,除非特别相信某个机构,否则不要在机器上随便导入证书,很危险。

 

  • req命令说明:

[new/x509]

当使用-new选取的时候,说明是要生成证书请求,当使用x509选项的时候,说明是要生成自签名证书。

 

[/key/newkey/keyout]

key和newkey是互斥的,key是指定已有的密钥文件,而newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,然后生成的密钥名称有keyout参数指定。

 

当指定newkey选项时,后面指定rsa:bits说明产生rsa密钥,位数由bits指定。指定dsa:file说明产生dsa密钥,file是指生成dsa密钥的参数文件(由dsaparam生成)

 

[in/out/inform/outform/keyform]

in选项指定证书请求文件,当查看证书请求内容或者生成自签名证书的时候使用

 

out选项指定证书请求或者自签名证书文件名,或者公钥文件名(当使用pubkey选项时用到),以及其他一些输出信息。

 

inform、outform、keyform分别指定了in、out、key选项指定的文件格式,默认是PEM格式。

 

[config]

参数文件,默认是/etc/ssl/openssl.cnf(ubuntu12.04),根据系统不同位置不同。该文件包含生成req时的参数,当在命令行没有指定时,则采用该文件中的默认值。

举例:

/*生成证书请求,证书密钥,完成自签名,输入主体相关信息*/

openssl req -new -x509 -days 3650 -nodes -out server.pem -keyout server.key -out server.crt

 

  • SSL双向认证和SSL单向认证的区别:

双向认证 SSL 协议要求服务器和用户双方都有证书。

单向认证 SSL 协议不需要客户拥有CA证书。只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响 SSL 过程的安全性)密码方案。

 

  • TLS和SSL区别:

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议

 

由于HTTPS的推出受到了很多人的欢迎,在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制(但是几乎和SSL3.0无差异),标准化后的IETF更名为TLS1.0(Transport Layer Security 安全传输层协议),可以说TLS就是SSL的新版本3.1

 

  • 证书格式介绍:

 

  • 单向认证过程:

1.客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。

2.服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书

3.客户端使用服务端返回的信息验证服务器的合法性,包括:

 

证书是否过期

发型服务器证书的CA是否可靠

返回的公钥是否能正确解开返回证书中的数字签名

服务器证书上的域名是否和服务器的实际域名相匹配

验证通过后,将继续进行通信,否则,终止通信

 

4.客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择

5.服务器端在客户端提供的加密方案中选择加密程度最高的加密方式。

6.服务器将选择好的加密方案通过明文方式返回给客户端

7.客户端接收到服务端返回的加密方式后,使用该加密方式生成产生随机码,用作通信过程中对称加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送至服务器

8. 服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取对称加密密钥。

在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。

发布了110 篇原创文章 · 获赞 10 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章