参考视频
一. ssh加密和https加密
ssh是先加密再验证身份,而且要互相认证(konwn_host客户端验证和authoritykeys服务器验证)。https是先验证身份且只需要client验证server,然后加密传输。而且ssh在生成加密密钥前都是明文交换种子信息,靠计算量来保障不被截获破解。https在生成加密密钥前能通过过服务器公钥加密交换种子信息,靠服务器公钥加密保证不被截获破解。
二. 对称加密和非对称加密算法
1. 非对称加密算法
非对称加密算法存在一对密钥,通常用于身份验证。比如ssh登录验证,CA证书的验证。因为1. 公钥可以公开,任何人都可以使用。只要保管好私钥就可以很好的完成验证。2. 效率相对较低
2. 对称加密算法
对称加密算法只存在一个密钥,通常用于数据加密传输。如ssh连接后和CA验证成功后,客户端使用对称加密算法生成的会话密钥进行加密传输。
三. CA证书

1. CA证书的作用和注意点
-
CA证书的作用是使用了非对称加密算法验证服务器的合法性,并不是用于加密,加密要使用对称加密算法生成的会话密钥进行。
-
CA证书不是给服务器使用的而是给浏览器使用的,服务器使用的是CA机构签名的服务器证书,而是给某个网站配置的。配置了https证书的服务器上的网站不代表都可以用https连接,我们需要对指定的网站域名进行设置启用https。
-
向CA机构申请证书后,CA机构返回的不是CA证书,而是用CA机构私钥签名后的服务器证书,CA证书需要单独下载保存在浏览器。
-
在进行https通讯的时候,发送的不是CA证书 ,而是服务器证书。
-
服务器证书包含服务器的公钥,CA证书包含CA机构的公钥,CA证书通常在浏览器和CA机构。
2. CA证书的生成过程(准确来说生成的是服务器证书,CA证书无需生成可以直接下载)
- 服务器在本地生成一对密钥和CSR文件(CSR文件中包含了申请网站的信息和服务器公钥),并用私钥对CSR文件加密发送给CA机构
- CA机构用服务器公钥解密CSR,并用自己的私钥签名一张服务器证书(证书中包含服务器公钥),并将服务器证书(而不是CA证书)发送回服务器。(我们之前也是这样申请的服务器证书,有了CA签名的服务器证书,浏览器就可以通过根证书验证网站的合法性了)
3. CA证书的工作过程
(1)一般情况下客户端根据本地下载的CA根证书中包含的CA公钥来验证服务器证书是否有效。但是很多时候需要通过证书链进行验证,比如服务器证书由一个中间CA私钥进行签名,那他的上级CA就是中间CA机构,所以需要先由中间CA证书进行验证。然后因为中间CA证书由根CA证书进行签名,所以根证书又对中间CA进行验证,最后到达根CA证书自签名。根证书存放在浏览器中。验证时使用上一级的公钥来验证当前级的证书,递归验证,最后被根证书验证。才算验证成功
- 中间证书例子:
- 例一:
比如burpsuite,它作为中间人同时扮演服务器和客户端。我们把他自签名的根证书放到浏览器中并信任,当浏览器向burp发送请求时,burp作为服务器给浏览器发送服务器证书(该服务器证书就是bp用自己假的CA机构的私钥自己签发的,所以能够被刚才保存到浏览器的CA证书中的公钥验证通过),从而浏览器不会报错,实现了中间人劫持。 - 例二:
在未登录校园网的情况下向网站发起https请求。我们知道在使用https访问服务器时,浏览器第一个数据包不是http报文而是client hello报文。服务器如果接收到client hello就会返回其证书和随机数。但是此时校园网会拦截client hello,并返回校园网的CA证书。因为浏览器中并没有校园网根证书,此时就会在浏览器上看到访问不信任的网站。
(3)如果客户端验证服务器证书成功,客户端使用服务器的公钥(包含在服务器数字证书中)加密自己生成的pre-master发送到服务器客户端通过对称加密算法+客户端的随机数+服务器的随机数+自己生成的pre-master计算出会话密钥。服务器同理通过对称加密算法+ 服务器的随机数+ 客户端的随机数和pre-master计算出会话密钥。然后双方通过计算出的会话密钥进行通信。
因为服务器和客户端的随机数是明文传递可以获取,所以如果有了pre-master就可以计算出会话密钥,会话密钥在客户端生成,所以如果能获取到客户端的pre-master就可以解密https的内容


四. https的安全性分析
- 要想截获并分析https的流量只能在证书颁发阶段进行,即握手阶段。因为一旦握手成功数据统一使用会话密钥加密传输,无法破解。
- 中间人固然可以申请到合法的CA数字签名的服务器证书,同时浏览器也知道中间人的证书是合法的。**那是不是就可以随意进行中间人拦截了呢?**因为服务器还会检测证书中的域名是否和需要访问的域名一致。中间人服务器域名和目标域名肯定不一致所以浏览器也会拒绝连接。**那中间人如果主动修改服务器证书域名为目标域名是不是就可以实现拦截了呢?**也不行,因为修改之后,浏览器根证书使用公钥验证证书是否被修改。所以要拦截只能在浏览器安装中间人CA根证书,中间人CA根证书没有安全性,可以验证成功被修改了的证书。
五. 其它问题
1. clash为什么不需要下载证书?
因为只有要对https加密流量进行分析时才需要证书验证过程,clash只负责转发而不是分析流量。
2. ssh连接时使用的known_hosts文件和CA都用于验证服务器身份,他们的区别是什么?
1. 首先理解ssh的通信过程:
ssh连接依靠的是两对密钥对,服务器密钥对和客户端密钥对进行身份验证。依靠会话密钥进行加密传输。
- 具体过程为:
- 客户端:
客户端使用客户端私钥加密签证,服务器使用客户端公钥验证。 - 服务器:
- 服务器将自己的公钥发送给客户端,客户端保存到known_hosts
- 服务器使用私钥签名发送到客户端,客户端用服务器公钥验证
- 客户端验证成功后,客户端使用对称加密算法产生一个会话密钥,然后使用服务器的公钥加密该会话密钥,并发送给服务器。服务器使用私钥进行解密
- 最后服务器和客户端依靠该会话密钥,和约定的对称加密算法对数据进行非对称加密通信。
(加密后数据的格式为 密文+MAC字段,密文用于避免明文直接暴露,MAC用于判断数据是否被修改,MAC字段可以简单理解为MD5指纹验证,但是MAC字段并不是使用的MD5算法)
- 客户端:
2. 为什么不使用ssh来替代CA证书?
- ssh在客户端验证服务器身份时,客户端需要存储每个服务器的公钥对服务器一一进行验证,而CA证书不一样,多个服务器可以使用一家CA机构的签名,从而客户端无需保存每个服务器公钥,只需要保存一家根CA证书即可。
- ssh在服务器验证客户端身份时,ssh要么采取密码登录的方式(太麻烦),要么让服务器保存客户端的公钥,这样也会增大服务器开销。而使用CA证书,多个客户端也可以使用一家CA机构的签名,从而服务端无需保存每个客户端公钥,只需要保存一家根CA证书即可。
726






