背景
大家可能遇到过爬虫或者curl某个https站点,由于站点TLS证书过期或者使用自签证书,curl或者浏览器校验不通过,导致不能正常访问。 所以类似什么Java中怎么跳过https证书校验,php怎么跳过,python怎么跳过等等问题全网遍地都是。 但是你知道跳过https证书底层到底干了什么事情呢? https不懂的同学可以先简单看我的一篇文章: https加密和解密过程。网上太多人只讲通过校验后怎么样, 很少讲不校验证书怎么样,很是蛋疼,全网文章几乎没人提到。
疑问1: 困惑了我几天的问题, 一般来说正常的https通过校验的情况, 如访问https:/www.baidu.com为例。拿到证书, os内置或者浏览器内置根证书的public key,public key解密证书内容,拿到内容进行hash比较,域名校验等等,通过校验则拿到网站的公钥, 之后走ssl握手协议一系列操作之后, 协商出”会话密钥”进行后边的通信。 那么问题来了, 假设我访问自签证书的网站,使用curl -k(跳过证书合法性校验), 不校验证书正确性, 由于os/浏览器根本就没有这个自签证书的public key, 那肯定解密不出证书的数据, 例如server的公钥,那不是和正常流程又有区别了, 但是还是能访问的页面内容,这个就很奇怪。那么后面的通信又是怎么进行的呢? 是否还走加密通信方式? 以及server公钥从证书里拿不出来的问题。
个人总结
参考知乎 如果没有有效的证书,HTTPS连接是否加密的? 此人回答瞬间茅塞顿开。
对于上面的疑惑: 跳过https校验是否还走加密通信的方式? 底层实现,证书解不开,server端公钥拿不到又怎么解释?
- 肯定还是走TLS加密通信。 因为人家网站就是基于https的,肯定是加密的,这个不用质疑,不会存在说你跳过证书校验就不走加密了。
- TLS可以分为2个功能方面来理解,1是 ca证书身份认证,2是后面数据进行加密通信,保证在传输过程中不被篡改。 两个方面没有必然前置关系, 也就是ca证书校验是可以在客户端进行选择校验还是不校验,和下面第2步加密通信无关,校验就走校验规则,不校验也可以走第2个步骤继续加密通信。 只是说, 这时候由于证书解密解不出来,server的公钥拿不出来了, 那系统就不能走RSA非对称加密算法来传递”会话密钥”, TLS客户端会自动转化使用DH算法(个人理解:类似生成临时非对称加密秘钥对,是传递”会话密钥”),完成后面加密通信的过程。
- 使用自签TLS证书通信虽然是加密的,但是https身份认证的功能也就荡然无存了 。任何人都可以自签发证书,容易受到中间人攻击以及伪装。 中间人也自己签发证书,替换掉你的证书,客户端也察觉不到的。谁叫你自己不校验呢? 就像电话诈骗, 警察再三提醒你对法对方可能是骗子(不安全提示), 你还是傻不拉几地坚持汇款,那肯定是能汇款的啊,银行又不能阻止你汇款,但是后果自己承担。