SSL握手是最为复杂的一步了,具体过程如下:

1.客户端(通常就是web浏览器)向服务器发送自己支持的加密规则并请求证书。

2.服务器选择一组加密算法和HASH算法,以及服务器证书发送给浏览器。(SSL支持双向认证,web服务器将服务器证书发送给客户端,然后再将客户端的证书回送给服务器。但是实际应用中很多用户都没有自己的客户端证书,因此服务器也很少会要求客户端证书)

3.浏览器获取服务器证书之后需要验证证书的合法性。具体有以下几个步骤: 服务器证书一般包括如下信息:证书序列号,证书过期时间,站点组织名,站点DNS主机名,站点的公开密钥,证书颁发者名称,证书颁发者的签名。网景公司提出了一种web服务器证书有效性算法是大部分浏览器有效验证服务器证书的基础。主要验证步骤如下:

3.1 日期检测。

检查证书的起始时间和结束时间,以确保证书仍然有效。如果证书过期了或者还没有被激活,则证书有效性验证失败,浏览器提示错误信息。

3.2 证书颁发者可信度检测。

每个SSL证书都是由某些证书颁发机构(CA)签发的,它们负责为服务器担保。证书有不同等级,每种证书都需要不同级别的背景验证。任何人都可以生成证书,但是有些CA是非常著名的组织,它们可以通过非常清晰的流程来验证证书申请人的身份以及商业行为的合法性。因此,浏览器通常会附带一个签名颁发机构的受信列表。如果是未知机构颁发的证书,则浏览器会显示警告信息。

3.3 签名检测。 一旦判定证书颁发者可信,浏览器就需要使用证书颁发者的公钥对信息进行签名,并将其与证书中的签名进行比对,如果两者不同,则信息可能被修改过,不能通过验证。

3.4 站点身份认证 为防止服务器复制其他人的证书,或拦截其他人的流量,大部分浏览器都会试着去验证证书中包含的DNS主机名是否与正在对话的主机名是否匹配。如果不匹配,则要么是浏览器警告用户,要么就是直接终止连接。对 于虚拟主机(一台服务器有多个主机名)站点上的安全流量处理是比较棘手的,有些流行的web服务器程序只支持一个证书,如果用户请求虚拟主机名,则与证书 中的主机名不匹配,这样浏览器会发出警告。一个处理办法是在开始安全事务前,将虚拟主机域名重定向至服务器证书中的官方主机名。(服务器证书中通常只包含一个主机名,但有些CA会为一组服务器创建一些包含了服务器名称列表或者通配域名的证书)

4.如果服务器证书验证通过,则浏览器会生成一串随机的数字作为密码(实际用作密码的随机字符串生成过程比较复杂,这里简化了其过程。具并用服务器证书中的公钥进行加密。 此外,浏览器使用第2步中商量好的HASH算法对握手消息进行加密,采用的密码就是刚刚生成的那串随机数字。最后将这些信息(用公钥加密的随机数密码,握手消息,采用HASH算法、随机数密码加密的握手消息签名)发送给服务器。

5.服务器接收浏览器信息,需要进行如下处理:

5.1 用私钥解密获取随机数密码。

5.2 用HASH算法根据该随机数密码对握手消息进行签名,比对浏览器发来的签名和该计算得到的签名是否一致。

5.3 如果签名验证通过,则使用该随机数密码加密一段握手消息,发送给浏览器。

6.浏览器接收握手消息并使用随机数密码以及之前的HASH算法计算握手消息的HASH值。如果与发来的HASH值一致,此时握手结束,后续的消息都会通过随机数密码来进行加密和解密,使用的加密方法是对称加密。要注意之前的公钥加密和私钥解密使用的是非对称加密算法。

 

推荐阅读: HTTPS是如何工作的     SSL相关术语介绍     什么是SSL证书,SSL协议有什么用?

关于我们