东东想要访问 xx 网站,底层的网络都架设好了:
链路层把网络从物理上链接起来。
网络层根据 IP 的路由规则可以从东东的主机导航到 xx 服务器的主机。
传输层从东东的浏览器进程传输数据到服务器的 xx 服务进程。
然后应用层就是解析 http 内容,做不同的处理和展示了。
基于这些网络的基础设施,东东就可以访问他喜欢看的 xx 网站了。
但是东东想在 xx 网站上存储一些自己的数据,那得加一个自己的标识吧,也就是用户名,还得加个密码来证明这是自己。
创建这个标识的过程就是注册,而证明这个标识是自己的过程就是登陆。
但是过了一段时间,东东就发现不对劲了,隔壁的小王怎么知道自己看了 xx 网站呢?
他肯定半路截胡了,或者看到了我的用户名密码,或者看到了我访问的内容。
怎么办呢?
加密!
我把内容放到箱子里锁起来传过去,那边用对应的钥匙就能打开。别人没有钥匙就看不了内容。这种钥匙叫对称钥匙。
但是怎么把钥匙传过去还不被别人知道呢?
东东陷入了思考。
这时候光光给他介绍了一把神奇的锁。这把锁开锁和解锁要用不同的钥匙,叫非对称钥匙,说是可以解决问题。
东东想了一会,对哦,如果开锁和解锁用不同的钥匙,那 xx 服务器只要把一把钥匙给我就好了,我把内容放进去,只有他能解锁。
这样就解决了对称钥匙传递的难题,之后对方拿到钥匙就可以进行加密的通信了。
后来东东才知道这种加密技术叫做 RSA,可以生成两把密钥。
把一个密钥留下,一个密钥公开。
留下的密钥自有自己有,叫做私钥。
公开的密钥所有人都可以拿到,叫做公钥。
公钥加密只有私钥能解密,私钥加密只有公钥能解密。
因为公钥是公开的,别人加密了只有我能解密,这种叫做加密。
私钥是只有我一个人有,我加密了,别人都能解密,但都知道是我加密的,能证明我的身份,这种叫做签名。
加密和签名分别用来解决不同的问题。
回到东东的问题,世界上有那么多带锁的箱子和公钥,我怎么知道这个箱子和公钥就是 xx 服务器给我的呢?
要是有一个权威机构能鉴别公钥的真伪就好了。
这个机构就叫做 CA,专门用于鉴别公钥真伪的,被这个机构认证为真的公钥就被称作数字证书。
现在东东的电脑上保存了信任哪些 CA,然后访问 xx 网站的时候,就会拿到它的数字证书,对比了一下,是我信任的 CA 颁发的。那就把对称密钥传给他好了,之后我们用对称密钥来加密通信的消息。
之后,东东就能愉快的访问 xx 网站,而不用担心隔壁小王的窥探了。
理一下其中的技术:
最核心的是非对称加密用的 RSA 算法,可以生成两把密钥,分别作为公私钥,用来加密和签名,通过这种方式传递对称密钥,之后进行信息的加密传输。公钥还需要鉴别下真伪,这个是 CA 做的,那个是存在计算机里的可信任的机构,他们认证的公钥叫做数字证书。
那这种技术是在网络的哪一层呢?
进程到进程的加密传输,明显是传输层,这种协议叫做 SSL。发布了 1.0、2.0、3.0 的版本后,发现了个 bug,后来修复了,感觉改动比较大,就改了个名字叫 TSL。
再上层就是 http 来访问网站内容了。
所以这种安全的通信是 SSL HTTP 或者叫 TLS HTTP,合起来叫做 https。
CA 认证的证书也就可以叫做 https 数字证书、ssl 数字证书、tls 数字证书等等。
后来东东做了程序员,不只是通过网页浏览 xx 网站的网页,更要链接到服务器上去执行一些脚本,专业了不少。
和访问 xx 网站一样,同样要登陆,那还可以用 https 么?
不行,不是每个网站都找 CA 认证一遍的,不然内部那么多服务器,都认证一边才能访问么?
所以简化一下,xx 服务器把公钥直接给我,让我自己选择是否信任:
这样我只要信任了公钥就可以证明是 xx 服务器,然后把用户名密码传过去,那边验证下,就可以登陆服务器了。这叫做 ssh 协议。
看起来和 https 没多大差别,只不过公钥不需要 CA 认证了。
这还不够,每次还要输入用户名密码多麻烦,怎么能不输入密码就能证明我的身份呢?
东东想起来 RSA 的私钥可以用来签名,那我把公钥给 xx 服务器,通过私钥加密一段随机的内容,他能解开不就是证明了是我么?
所以东东改进了下 ssh 协议,不是信任了服务器的公钥就传用户名和密码过去了, 而是服务器返回一段随机数,我这边用我的私钥加密下这段随机数(也就是签个名),那边能解开就证明了是我。
私钥签名能达到证明身份的目的,那还用啥用户名密码呢,而且还更安全。
就这样,东东就可以免密登陆 xx 服务器执行各种命令了。
只是刚开始的时候需要在本地生成公私钥,把公钥告诉 xx 网站就行了。
回想一路以来用到的 htts 和 ssh,虽然都是基于公私密钥,但确实是有一些区别的:
- https 的取向是面向普通用户的,他们是通过用户名和密码认证身份的,只需要浏览器上同意下数字证书,就可以拿到对称密钥,然后加密通信的数据,对于普通用户来说,只不过在浏览器地址栏多了个小钥匙的图标,其他的感觉不到。
- ssh 的取向是针对专业用户的,他们既可以通过用户名和密码认证身份,还可以通过一套公私钥来认证身份,而且服务器比较多,不需要 CA 认证,打在控制台自己看一下就行。通过私钥签名取代了用户名密码,还能够免密登陆。
其实区别就两个,一个是公钥是否 CA 认证,一个是认证身份使用用户名密码还是公私钥。
当然,他们用于的目的也不同,一个是网页的安全浏览的,一个是远程执行命令的。
https 和 ssh 因为不同的取向,在 RSA 的公私钥机制的基础上,发展成了不同的协议。东东也从普通的电脑用户成长为了一名专业的程序员。