SSL 握手协议详解
RSA作为身份认证,ECDHE来交换加密密钥,AES/DES等作为加密。
如果RSA来加解密,那么身份认证后,直接用认证后的RSA公钥解密。不需要再额外交换加密密钥了。
相关报文:
报文类型 |
参数 |
hello_request |
空 |
client_hello |
版本、随机数、会话ID、密文族、压缩方法 |
server_hello |
版本、随机数、会话ID、密文族、压缩方法 |
certificate |
x.509V3证书链 |
server_key_exchange |
参数、签名 |
certificate_request |
类型、授权 |
server_done |
空 |
certificate_verify |
签名 |
client_key_exchange |
参数、签名 |
finished |
Hash值 |
A. 安全能力交换
建立的安全属性包括:协议版本、会话ID、密文族、压缩方法,同时生成并交换用于防止重放攻击的随机数。密文族参数包括密钥交换方法(Deffie-Hellman密钥交换算法、基于RSA的密钥交换和另一种实现在Fortezza chip上的密钥交换)、加密算法(AES,3DES、RC4、RC2、3DES等)、MAC算法(MD5或SHA-1)、加密类型(流或分组)等内容。
重放攻击(Replay Attacks)又称重播攻击、回放攻击或新鲜性攻击(FreshnessAttacks),是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。说白了就是黑客C在通信线路上进行信号采集,比如A发往B的。然后,黑客C将监听到的信息,再次发往B,这时B以为是A发过来的,所以就会误认为是A在和其进行通信。如果这些通信过程中,涉及到了账户信息,隐私,交易,黑客就会得到得到这些内容。
防止重放攻击:随机数是为了防止重放攻击。要求通信双方必须事先协商一个初始序列号,并协商递增方法,一般随机数。通信双方通过消息中的序列号来判断消息的新鲜性。并且通过以下带时间戳的提问与应答的方式。
(1.) 客户机向服务器发送client_hello报文,带随机数。SSL 客户端通过 Client Hello 消息将它支持的 SSL 版本、加密算法、密钥交换算法、MAC算法等信息发送给 SSL服务器。
(2.) 服务器向客户机回应server_hello报文带随机数。SSL 服务器发送服务端支持的 SSL 版本和加密套件,并通过 Server Hello消息通知给 SSL 客户端。
client:我想和你说悄悄话,我会的密钥交换算法有(ECDH,RSA等),加密算法有(AES,3DES、RC4、RC2、3DES等),摘要算法/MAC有(SHA,MD5)等。
Server:好的啊。我会的是这些。
Client hello 的内容
Server hello
B. 身份认证过程
(3.)在hello报文之后,如果服务器需要被认证,服务器通过SendCertificate将发送其证书。
(4.)客户端需要检查以下内容来完成对服务器的认证来得到服务器域名和公钥等:
时间是否在证书的合法期限内;
签发证书的机关是否客户端信任的;
签发证书的公钥是否符合签发者的数字签名;
证书中的服务器域名是否符合服务器自己真正的域名。
(5.)服务器要求客户端发送客户端自己的证书,Certificate Request。客户端发送自己的证书。ResponseCertificate.
(6.)收到后,服务器验证客户的证书来得到客户端的域名和公钥等,如果没有通过则结束。如第4步
Server:这是我的身份证书(里面有我的名字和公钥),你检查下啊(certificate )。暂时不需要重新请求客户证书,不过我也要确认是是否你(一般不确认)。
Client:这是我的签名,证书等,你检查下。
B. (加密算法确定)和密钥交换
如果加密算法采用RSA,那么不需要交换密钥了。如果是其他的,如AES,3DES等必须交换密钥。这个时候密钥交换一般是ECDHE等。以ECDHE为例子。
这个阶段是否还需要交换加密算法,我不确定。或许在第一阶段就确定了加密算法。假设加密算法是AES.
(7.)客户端生成一个随机数来生成PMS(Pre-master secret), 譬如ECDHE的A=a*G。并且用(8.) 服务端的RSA公钥加密传给服务端,服务端也生成一个随机数b,于是主密钥b*a*G。
(9.)服务端生成一个b来生成PMS(Pre-master secret) 譬如ECDHE的B=b*G。并且用客户端的RSA公钥加密传给客户端.
(10.)客户端收到B后,用自己的随机数a*B = a*b*G 得到主密钥。
Client:我们的暗号规则确定
Server:定为江湖规则1吧
Client:用这个(生成的随机数)去找到暗号的密码本吧
Server:生成随机数,发给客户端去找到暗号密码本
各自认证通过。
C. 握手结束,开始数据通信
Client:我给你发暗号了
Server:我给你会暗号了。