HTTPS和TLS基础知识笔记
一句话概括就是TLS是某种通话的加密手段,HTTPS是使用TLS进行加密的HTTP。
HTTPS,HyperText Transfer Protocol Secure,提供对网站服务器的身份认证,保护交换隐私与数据完整性1。(简单理解就是使用SSL/TLS加密数据报的HTTP)。
而TLS,Transport Layer Security,传输层安全性协议,前身为SSL, Secure Socket Layer,目的是为互联网通信提供安全及数据完整性保障2。
TLS运行机制
维基百科上关于过程的描述感觉并不是那么易懂,主要是出现了一些看不懂的名词,参考阮一峰的博客3总结并解释一下。
- 客户端向服务器发送“ClientHello”消息,主要包含:1)支持的协议版本,2)客户端生成的随机数,3)支持的加密算法
- 服务器回复“ServerHello”消息,包含:1)确认使用的协议版本,2)服务器生成的一个随机数,3)确认使用的加密算法,4)服务器的数字证书
- 客户端验证服务器证书与访问的域名是否匹配,证书是否可靠等。如果没有问题,则从证书中取出服务器的公钥,然后向服务器发送:1)一个随机数,2)Change Cipher Spec(告知服务器接下来的所有消息使用刚刚商定的keys和算法进行加密),3)握手结束消息(Client Finished)
- 服务器向客户端回复:1)Change Cipher Spec Message,2)Server Finished Message
客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把”会话密钥”。(存疑,缺乏引证)
随后客户端和服务器进入加密通信阶段,使用HTTP协议,对内容使用生成的会话密钥进行加密。
Q: 为什么需要第四步,在TCP三次握手中,客户端第三步验证成功之后就能够顺带发送数据给服务器了,这里为什么不可以。
A: 因为第三步还是明文,之后的消息需要加密。如果没有第四步服务器的确认,客户端收到服务器的消息之后难以确认这是明文还是密文(大概?)。
回忆一下HTTP建立连接的过程,
名词解释
数字签名
数字证书的使用也会涉及到数字签名,所以一并写在这里。
不知道 维基百科 数字签名-使用 这一节是谁编辑的,我是真的看不懂。后两节原理和实现讲得还稍清楚点.
因为没学密码学,关于加密算法不太懂不敢乱说。简单的理解数字签名的实现是,要签名的一方计算出需要签名的消息的散列值(比如使用SHA-256算法),也可称为摘要,使用私钥加密该摘要生成数字签名,然后把签名连同消息一同发送,并且公布自己的公钥;而要验证的一方,使用公钥解密签名之后也会得到一个摘要,与收到的摘要进行对比,如果一致那么说明收到的消息是由公钥的发布者发送的,没有被篡改或者伪造。
这个过程利用了非对称加密算法的特性,简要理解就是使用公钥加密之后,只能用私钥解密,反过来也是,使用私钥加密之后,可以用公钥解密;使用公钥进行加密的密文,再用公钥解密是无法成功的,所以叫非对称算法。
数字证书
证书实际是由证书签证机关(CA, Certificate Authority)签发的对用户的公钥的认证。证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等4。
验证数字证书的方法是,用户检验证书上的数字签名,来验证该证书是否的确是这个CA颁发的。
就如上一节介绍的一样,CA使用私钥对数字证书签名,把签名摘要连同数字证书一起打包发布;客户端验证的时候,用CA的公钥解密得到一份摘要,与数字证书中的摘要进行对比,如果一致则说明这份数字证书的确是该CA颁发。
而如果有伪造者连同公钥一起伪造了呢?
根据 数字签名、数字证书与HTTPS是什么关系? - 刘志军的回答 - 知乎 的一条评论
CA的公钥是浏览器内置的,所以不用担心假冒,除非用户安装了非内置的根证书。
因此一般情况下我们大可以相信CA是权威的。
话说,写着写着我想起来大二有门选修课留了个题目,用 Java 做一个黑框的文件传输系统,要求进行加密。当时我就直接找 Java 加密算法的 API ,随便选了个对称加密算法,生成了密钥在客户端和服务器的代码里各放一份,发送和接收各自用这个密钥加密解密就完事(密钥放代码里也不怕被反编译.class直接拿走?)
然后人家怎么做的呢,在服务器生成对称加密算法的密钥,然后用 RSA 加密发送给客户端,之后传输过程的加密就是用对称加密算法完成,甚至还测了使用这种方式与单纯使用 RSA 加密时传输速度的差别。而我……唉不说了,工头喊我搬砖去了。
如何生成数字签名
(TODO) write something here.
如何获取证书
有一些免费的颁发机构如 Let’s Encrypt,也有需要收费并且需要实名,详情自行了解。
我用 v2ray 时候听说 Caddy 会自动申请证书并且更新,图省事也就没自己玩过。
总之免费的证书应该是比较容易申请的,github有个项目acme.sh,是一个从Let’s Encrypt申请证书并按时更新的脚本,感兴趣的可以了解一下。