HTTPS只验证服务器的SSL握手过程(客户端验证服务器端)过程,参考这篇文章
https://www.jianshu.com/p/c2bf75485c15
假定客户端叫做爱丽丝,服务器叫做鲍勃,其验证步骤为:
- 爱丽丝(浏览器)给出协议版本号、一个客户端生成的随机数(随机数A),以及客户端支持的加密方法。
- 鲍勃(服务器)确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(随机数B)。
- 爱丽丝(浏览器)确认数字证书有效,然后生成一个新的随机数(随机数C),并使用数字证书中的公钥,加密这个随机数,发给鲍勃(服务器)。
- 鲍勃(服务器)使用自己的私钥,获取爱丽丝(浏览器)发来的随机数(随机数C)
- 爱丽丝(浏览器)和鲍勃(服务器)根据约定的加密方法,使用前面的三个随机数(A,B,C),生成"对话密钥"(session key),用来加密接下来的整个对话过程。
这篇文章也解释的比较详细,https://www.jianshu.com/p/1429b12a5519
根据上面的描述,有两个问题:
1.客户端如何检测数字证书是合法的并是所要请求的公司的?
2.数字证书中的公钥在哪里?
根据这些问题,找到了这篇文章https://blog.csdn.net/luluyo/article/details/88723701,有如下解释。
三、HTTPS运行原理
我们可以通过4个问题彻底理解HTTPS的运行原理,首先要从数字证书开始说起。HTTPS的安全性主要依赖于对数字证书的验证以及非对称加密机制,细看步骤3),客户端具体是如何判断证书的合法性的?
先来看看数字证书都有哪些内容
Issuer--证书的发布机构
发布证书的机构,指明证书是哪个公司创建的(并不是指使用证书的公司)。出了问题具体的颁发机构是要负责的Valid from,Valid to--证书的有效期
证书的使用期限。过了这个期限证书就会作废,不能使用。Public key--公钥
刚开始的时候介绍过公钥的概念,用于对消息加密的。Subject--主题
证书是颁发给谁了,一般是个人或公司名称或机构名称或公司网站的网址。Signature algorithm--签名所使用的算法
数字证书的数字签名所使用的加密算法,根据这个算法可以对指纹解密。指纹加密的结果就是数字签名。Thumbprint,Thumbprint algorithm--指纹以及指纹算法(一种HASH算法)
指纹和指纹算法会使用证书机构的私钥加密后和证书放在一起。主要用来保证证书的完整性,确保证书没有修改过。使用者在打开证书时根据指纹算法计算证书的hash值,和刚开始的值一样,则表示没有被修改过。a)
绕了一大圈,问题回来了,客户端如何检测数字证书是合法的并是所要请求的公司的?首先应用程序读取证书中的Issuer(发布机构),然后会在操作系统或浏览器内置的受信任的发布机构中去找该机构的证书(为什么操作系统会有受信任机构的证书?先看完这个流程再来回答)。如果找不到就说明证书是水货,证书有问题,程序给错误信息。如果找到了,或用户确认使用该证书。就会拿上级证书的公钥,解密本级证书,得到数字指纹。然后对本级证书的公钥进行数字摘要算法(证书中提供的指纹加密算法)计算结果,与解密得到的指纹对比。如果一样,说明证书没有被修改过。公钥可以放心使用,可以开始握手通信了。
b)
接下来解答操作系统为什么会有证书发布机构的证书?其实证书发布机构除了给别人发布证书外,自己也有自己的证书。在操作系统安装好时,受信任的证书发布机构的数字证书就已经被微软安装在操作系统中了,根据一些权威安全机构的评估,选取一些信誉很好并且通过一定安全认证的证书发布机构,把这些证书默认安装在操作系统中并设为信任的数字证书。发布机构持有与自己数字证书对应的私钥,会用这个私钥加密所有他发布的证书及指纹整体作为数字签名。
还有一个问题,如果没有有效的证书,HTTPS连接是否加密的?参考这篇文章https://www.zhihu.com/question/300285738、https://blog.csdn.net/abinge317/article/details/51791856
简单来说,如果客户端验证服务端的证书无效,此时通信过程仍然加密。
https证书有两个作用,一个是认证,一个是加密会话。
加密会话其实和证书关系不大,它是由客户端与服务器协商出来的。它可能会用到证书,比如用RSA算法协商session key的时候,就是用证书的公钥加密后发给服务器。而使用DH算法时可以不用证书。后续的会话都是用session key加密的,不会用证书的公钥,私钥加密。
证书主要的作用还是认证,让你可以确定服务器的真伪。
服务器没有有效的证书,就是证书不是有效的ca签发的,它不能证明服务器是真的,存在安全风险。一般浏览器会阻止你访问。如果你执意要访问,后续的流量都是加密的,但是并不安全。
验证数字签名的过程,参考https://www.jianshu.com/p/29e0ba31fb8d