最近跟第三方厂商调试接口,在调用接口时,需要使用SSL协议进行通信。
一、SSL协议
SSL基于公钥技术,可以保证两个应用之间通信的保密性和可靠性,使得两者之间的通信不被攻击者窃听。它介于HTTP协议和TCP协议之间,属于应用层协议。
先看一个例子:利用SSL协议来访问某网站,如在浏览器的地址栏输入:https://www.myssl.com
那么在HTTP层,浏览器会将用户的请求翻译成HTTP请求:
GET /index.html HTTP/1.1Host www.myssl.com
而在SSL层,会借助下层协议的信道,安全的协商出一份加密密钥,并用此密钥来加密HTTP请求。TCP层会建立与服务端443端口的连接,传递SSL处理后的数据。服务端在接收到数据后,处理与此过程相反。
由上述过程可以看出,SSL协议的基本过程如下:
客户端向服务器索要并验证证书
双方协商出共享密钥
双方利用共享密钥进行加密通信
二、密钥协商
众所周知,非对称加解密速度较慢,主要用于密钥交换,客户端和服务端通过公钥算法协商出一份密钥,然后通过该密钥使用对称加密来通信。当然,为了保证数据的完整性,在加密前,对数据先做HMAC处理。
客户端C | 服务端S | |
ClientHello(我想和你进行安全通信) 我支持的通信协议版本 产生客户端随机数R1 我支持的算法: 对称加密算法:DES 密钥交换算法:RSA/DH 摘要算法:MD5/SHA | ||
ServerHello 确认使用的加密通信协议版本 产生服务端随机数R2 我们用DES-RSA-SHA这对组合 这是我的证书(含有S的信息和公钥),你拿去验证一下吧 | ||
查看证书是否可信(一般通过CA验证),如果验证未通过,发出警告并断开连接。 若验证通过,则由客户端会产生一个随机数R3,并从证书中取得公钥进行加密,封装成ClientKeyExchange发送给S,用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥" 客户端握手结束通知,告诉S以后我将用加密的办法给你发消息了,同时发送前面发送的所有内容的hash值(HMAC),用来供服务器校验 注意:如果服务端需要客户端证书,这里还会发送客户端自己的证书 | ||
用自己的私钥将ClinetKeyExchange中的秘密信息解密出来,用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥" 服务端握手结束通知,告诉C以后我将要加密的办法给你发消息了,发送前面发送的所有内容的hash值(HMAC),用来供客户端校验 | ||
加密请求数据… | ||
解密请求信息,加密应答数据… | ||
解密应答信息… |
握手阶段结束后,客户端和服务端将进行加密通信,只不过后面的过程都使用的是基本的HTTP协议,只是将数据使用会话密钥加密而已。