首页 > 其他分享 >九个问题带你-从入门到熟悉 HTTPS

九个问题带你-从入门到熟悉 HTTPS

时间:2023-05-24 10:03:04浏览次数:48  
标签:公钥 加密 入门 证书 HTTPS 服务器 客户端 九个

Q1: 什么是 HTTPS?
BS: HTTPS 是安全的 HTTP
HTTP 协议中的内容都是明文传输,HTTPS 的目的是将这些内容加密,确保信息传输安全。最后一个字母 S 指的是 SSL/TLS 协议,它位于 HTTP 协议与 TCP/IP 协议中间。

Q2: 你说的信息传输安全是什么意思
BS: 信息传输的安全有三个方面:

1、客户端和服务器直接的通信只
2、有自己能看懂,即使第三方拿到数据也看不懂这些信息的真实含义。
3、第三方虽然看不懂数据,但可以 XJB 改,因此客户端和服务器必须有能力判断数据是否被修改过。
4、客户端必须避免中间人攻击,即除了真正的服务器,任何第三方都无法冒充服务器。
很遗憾的是,目前的 HTTP 协议还不满足上述三条要求中的任何一条。

Q3: 这么多要求,一个一个去满足是不是很累?
BS: 不累,第三个要求可以不用管

是的,我没开玩笑,你可以暂时别管第三个要求,因为它实际上隶属于第一个需求。我们都知道加密需要密码,密码不是天下掉下来,也得需要双方经过通信才能协商出来。所以一个设计良好的加密机制必然会防止第三者的干扰和伪造。等搞明白了加密的具体原理,我们自然可以检验是否满足:“任何第三者无法冒充服务器”这一要求。

Q4: 那怎么加密信息呢
BS: 使用对称加密技术

对称加密可以理解为对原始数据的可逆变换。比如 Hello 可以变换成 Ifmmp,规则就是每个字母变成它在字母表上的后一个字母,这里的秘钥就是 1,另一方拿到 Ifmmp 就可以还原成原来的信息 Hello 了。
引入对称加密后,HTTPS 的握手流程就会多了两步,用来传递对称加密的秘钥:
1、客户端: 你好,我需要发起一个 HTTPS 请求
1、服务器: 好的,你的秘钥是 1。
提到了对称加密,那么自然还有非对称加密。它的思想很简单,计算两个质数的乘积很容易,但反过来分解成两个质数的乘积就很难,要经过极为复杂的运算。非对称加密有两个秘钥,一个是公钥,一个是私钥。公钥加密的内容只有私钥可以解密,私钥加密的内容只有公钥可以解密。一般我们把服务器自己留着,不对外公布的密钥称为私钥,所有人都可以获取的称为公钥。
使用对称加密一般要比非对称加密快得多,对服务器的运算压力也小得多。

Q5: 对称秘钥如何传输
服务器直接返回明文的对称加密密钥是不是不安全。如果有监听者拿到这个密钥,不就知道客户端和服务器后续的通信内容了么?
BS: 利用非对称加密
是这样,所以不能明文传递对称秘钥,而且也不能用一个新的对称加密算法来加密原来的对称秘钥,否则新的对称秘钥同样无法传输,这就是鸡生蛋、蛋生鸡的悖论。
这里我们引入非对称加密的方式,非对称加密的特性决定了服务器用私钥加密的内容并不是真正的加密,因为公钥所有人都有,所以服务器的密文能被所有人解析。但私钥只掌握在服务器手上,这就带来了两个巨大的优势:
1、服务器下发的内容不可能被伪造,因为别人都没有私钥,所以无法加密。强行加密的后果是客户端用公钥无法解开。
2、任何人用公钥加密的内容都是绝对安全的,因为私钥只有服务器有,也就是只有真正的服务器可以看到被加密的原文。
所以传输对称秘钥的问题就迎刃而解了: 秘钥不是由服务器下发,而是由客户端生成并且主动告诉服务器。
所以当引入非对称加密后,HTTPS 的握手流程依然是两步,不过细节略有变化:
客户端: 你好,我需要发起一个 HTTPS 请求,这是我的 (用公钥加密后的) 秘钥。
服务器: 好的,我知道你的秘钥了,后续就用它传输。

Q5: 那公钥怎么传输
你好像还是没有解决鸡生蛋,蛋生鸡的问题。你说客户端发送请求时要用公钥加密对称秘钥,那公钥怎么传输呢?
BS: 对公钥加密就行了。。。
每一个使用 HTTPS 的服务器都必须去专门的证书机构注册一个证书,证书中存储了用权威机构私钥加密的公钥。这样客户端用权威机构的公钥解密就可以了。
现在 HTTPS 协议的握手阶段变成了四步:
1、客户端: 你好,我要发起一个 HTTPS 请求,请给我公钥
2、服务器: 好的,这是我的证书,里面有加密后的公钥
3、客户端: 解密成功以后告诉服务器: 这是我的 (用公钥加密后的) 对称秘钥。
4、服务器: 好的,我知道你的秘钥了,后续就用它传输。

Q6: 你在逗我么。。。。
那权威机构的公钥又怎么传输?
BS: 存在电脑里
这个公钥不用传输,会直接内置在各大操作系统(或者浏览器)的出厂设置里。之所以不把每个服务器的公钥内置在电脑里,一方面是因为服务器太多,存不过来。另一方面操作系统也不信任你,凭什么你说你这个就是百度/淘宝的证书呢?
所以各个公司要先去权威机构认证,申请证书,然后操作系统只会存储权威机构的公钥。因为权威机构数量有限,所以操作系统厂商相对来说容易管理。如果这个权威机构不够权威,XJB 发证书,就会取消他的资格,比如可怜的沃通。。。。

Q7: 怎么知道证书有没有被篡改?
你说服务器第一次会返回证书,也就是加密以后的公钥,那我怎么知道这个证书是可靠的?
BS: 将信息 hash 值随着信息一起传递

我们都知道哈希算法的特点,它可以压缩数据,如果从函数角度来看,不管多复杂的数据(定义域可以非常大)经过哈希算法都会得到一个值,而且这个值处在某个特定(远小于定义域的范围)值域内。相同数据的哈希结果一定相同,不相同数据的哈希结果一般不同,不过也有小概率会重复,这叫哈希冲突。
为了确保原始证书没有被篡改,我们可以在传递证书的同时传递证书的哈希值。由于第三者无法解析数据,只能 XJB 改,那么修改后的数据在解密后,就不可能通过哈希。
比如说公钥就是之前的例子 Hello,我们假设哈希算法是获取字符串的最后一个字符,那么 Hello 的哈希值就是 o,所以加密字符串是 Ifmmpp。虽然公钥已知,每个人都可以解密,解密完也可以篡改,但是因为没有私钥, 所以无法正确的加密。所以它再返回给客户端的数据是无效数据,用公钥解析后会得到乱码。即使攻击者通过多次尝试碰巧能够解析,也无法通过哈希校验。

Q8: 这样可以防止第三方冒充服务器么
BS: 也许可以

首先真正的服务器下发的内容,无法被别人篡改。他们有权威机构的公钥,所以可以解密,但是因为没有私钥,所以解密以后的信息无法加密。没有加密或者错误加密的信息被客户端用公钥解密以后,必然无法通过哈希校验。

但是,如果你一开始请求的就不是真的服务器,而是一个攻击者,此时的他完全有机会进行中间人攻击。我们知道第一次握手的时候服务器会下发用于证明自己身份的证书,这个证书会用预设在设备上的公钥来解密。所以要么是经过认证的证书用权威机构的私钥加密,再用权威机构解密,要么是用非权威机构的私钥加密,然后找不到公钥解密。

所以如果不小心安装过非权威机构的根证书,比如黑客提供的恶意证书,这时候设备上就多了一个预设的公钥,那么用恶意私钥加密的证书就能被正常解析出来。所以千万不要随便装根证书,这等于是为那些恶意证书留了一扇门。

当然,凡是都有两面性。我们知道 Charles 可以调试 HTTPS 通信,它的原理就是需要用户安装 Charles 的根证书,然后我们的请求会被代理到 Charles 服务器,它下发的 Charles 证书才能被正确解析。另一方面,Charles 会作为客户端,从真正的服务器哪里拿到正确的 https 证书并用于后续通信。幸好 Charles 不是流氓软件,或者它的私钥一旦泄露,对用户都会造成很大的影响。

我可以举一个例子,证书有多个种类,最贵的叫 EV (Extended Validation),它需要公司营业执照等多个文件才能申请人工审核,好处也很明显,可以在浏览器地址栏左侧准确显示公司名称,比如 Bitbucket 的官网:

九个问题带你-从入门到熟悉 HTTPS_HTTPS


代理模式下无法显示

Q9: HTTPS 握手会影响性能么
TCP 有三次握手,再加上 HTTPS 的四次握手,会不会影响性能?
BS: 影响肯定有,但是可以接受

首先,HTTPS 肯定会更慢一点,时间主要花费在两组 SSL 之间的耗时和证书的读取验证上,对称算法的加解密时间几乎可以忽略不计。
而且如果不是首次握手,后续的请求并不需要完整的握手过程。客户端可以把上次的加密情况直接发送给服务器从而快速恢复,具体细节可以参考 图解SSL/TLS协议。
除此以外,SSL 握手的时间并不是只能用来传递加密信息,还可以承担起客户端和服务器沟通 HTTP2 兼容情况的任务。因此从 HTTPS 切换到 HTTP2.0 不会有任何性能上的开销,反倒是得益于 HTTP2.0 的多路复用等技术,后续可以节约大量时间。
如果把 HTTPS2.0 当做目标,那么 HTTPS 的性能损耗就更小了,远远比不上它带来的安全性提升。

结语

相信以上九个问题足够帮助新人了解 HTTPS 了,但这只是基本概念,关于 HTTPS 的使用(比如 iOS 上的一些具体问题)还需要不断尝试和研究。


本文地址:https://www.linuxprobe.com/nine-queses-https.html

标签:公钥,加密,入门,证书,HTTPS,服务器,客户端,九个
From: https://blog.51cto.com/u_12148962/6337022

相关文章

  • 入门指南:学习C++编程的关键步骤
    C++是一种功能强大的编程语言,广泛应用于软件开发和系统编程。如果您想学习C++编程,下面是一些关键的步骤,可以帮助您入门。安装C++编译器要开始学习C++,您需要安装一个C++编译器。常用的C++编译器有GCC、Clang和MicrosoftVisualC++等。您可以根据自己的操作系统选择适合的编译器,并......
  • Book-Git从入门到精通
    Book-Git从入门到精通gitadd.gitadd--allgitlog--oneline--graphgitrmxxxx--cachedgitcommit--amend-m"xxxx"修改最后一次commit信息gitrebasegitresetgitclean-fX清除忽略的文件gitblamexxxgitblame-L5,10XXX指定5~10行gitreflog默认保......
  • MongoDB入门
    一、业务应用场景三高需求:高并发读写需求海量数据的高效率存储和访问的需求对数据库的高扩展性和高可用性的需求应用场景:社交场景,使用MongoDB存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能游戏场景:方便查询、高效率存储和访问物流场景:......
  • ​https网址放在浏览器上访问,​https后面的冒号:消失不见,并且访问失败
    由于地址前面多了一个看不见的符号%E2%80%8B,这个特殊符号叫Zero-width-space(零宽空格),它是一个Unicode字符,肉眼不可见,却是确实存在的一个字符。使用encodeURI 编码可以发现从swagger文档复制,字符就可能存在%E2%80%8B,可以把地址前面的http://拼接上baidu.com放浏览器搜索,查看请......
  • java入门
    java简介:1.什么是程序:程序通常指完成某些事情的一种既定方式和过程;(方式){细节1;细节2;细节3}(过程){第一步;第二步;第三步}2.java的产生:1995年诞生。java之父高斯林3.java的发展史:java诞生于1995年。java目前在企业开发过程中,使用和占有率最高的是jdk1.84.java的技术平台:java技术平......
  • 《workflow跳远》activiti篇——activiti简介入门
    工作流为什么出现最初,开发人员开发一个流程,例如请假流程,员工提出请假申请——领导同意——财务人员记录,一般通过状态字段来跟踪流程变化,设zt=0为初始状态,zt=1为保存状态,zt=2提交到领导,zt=3提交到财务,zt=4财务人员记录完成。员工、领导、财务人员这些不同角色,通过状态字段的取值决......
  • https部署与docker下nginx的转发+文件获取
    进入nginx容器查看是否有etc/nginx/cert目录将https的域名证书放到cert目录下配置80和443server{#listen80;#侦听80端口listen80;#侦听443端口,用于SSLserver_name127.zyfdtsite.com;client_max_body_size1024m;#charsetkoi8-r;#acc......
  • vernemq 一个可用的入门指南之一:Mac下的安装及使用,使用MQTTX访问verneMQ
    因为百度到一篇简书的,不可用,所以写这么一篇,方便后来人物联网的消息队列技术选型,很多地方会推荐使用VerneMQ,这里做一个安装实验记录,并非推荐。gitclonehttps://github.com/vernemq/vernemq.gitcdvernemqsudomakerel 官网没有加sudo,执行失败,安装过程会多次下载github......
  • 前端学习 node 快速入门 系列 —— 事件循环
    事件循环本篇将对以下问题进行讨论:浏览器有事件循环,node也有事件循环,两者有什么异同?node核心特性(事件驱动和非阻塞I/O)和事件循环有什么关系?node中的高并发和高性能和事件循环有关系吗?node不适合什么场景?有人说Node是单线程,有人又说node存在多线程,哪个正确?如果一......
  • Luogu P2801 教主的魔法(Loj 数列分块入门 2)
    教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是\(N\)个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为\(1,2,\ldots,N\)。每个人的身高一开始都是不超过\(1000\)的正整数。教主的魔法每次可以把闭......