{公钥,私钥}是全球唯一的一对数据。公钥随意给人看,不保密。私钥牢牢的保存在一个设备的手里,不能泄漏给任何第三方。{公钥,私钥}对是可以通过openSSL等工具成对的生成的。什么你不相信openSSL?也可以学数学,研究RSA算法,研究什么大数分解质因数的什么,自己做。这就是非对称加密。
第一种使用方式: 密文 = 加密算法( 明文,秘钥 )
明文 = 解密算法( 密文,公钥 )
第二种使用方式: 密文 = 加密算法( 明文,公钥 )
明文 = 解密算法( 密文,私钥 )
第一种方式的内部逻辑是:接收方无法否认发送方的真实身份,因为啥呢?用对应的公钥解出来,在现有科技水平下,是不可能有人假冒另一个秘钥冒充发送方的(除非入室盗取发送方办公设备和秘钥)。但是不排除窃听者用公钥偷听内容,因为公钥是公开的。
第二种方式的内部逻辑是:发送方的发出的信息,无法被任何人窃取有用信息,因为只有拥有秘钥的接收方一个人能解出明文。但是,发送方是好人还是坏人,接收方不能通过秘钥逻辑得出结论,发送方有可能是得到公钥的骗子。
两种方式都有漏洞。而且,还有另外一个小问题,非对称加密运算量大且慢,不利信息流通。
为了解决上述问题。我们引入{证书,签名}机制 与 对称加密机制。你说什么?对称加密不是容易被窃听,伪造中间人吗?这不是走死路吗?是的。但是,三个臭皮匠顶个诸葛亮。
证书: 证明我是我的文件。你不是怀疑我是骗子吗?给你个证书,里面白字黑字写了我是我啊!
签名:什么?谁证明这张证书的真实性? 我有官方的红头盖章和签字啊!这就是所谓的“签名”
CA:能证明我是我的官方机构,我交点钱让他给我作证明我是我。
业务流程:
1)我向CA提交我本人的信息(我的公钥,我的域名),别忘了交点钱啊,可能还有保险费。
2)CA通过各种途径和交费多少,对我的身份做验证。有可能我资质不全,不通过我的申请
3)CA通过对我的审核。然后制作一张证书,内容最简为:
证书正文:颁发者(CA),主体(我),我的公钥,算法相关的配置信息
签名:签名 = 加密算法( 哈希摘要(证书正文),CA的秘钥 )
4)我就直接拿走证书用了,怎么用呢?
5)通讯开始做加密方面的握手,比如就和你通讯吧。我把证书传给你审阅。
你看了一下证书,取出颁发机构的CA公钥。根据算法配置信息取出预先准备的解密算法。
你要计算一个A = 解密算法(签名, CA公钥)。A大概是一个证书正文的哈希摘要的东西。
你还要做个事,计算一个B = 哈希摘要(证书明文)
如果 A==B, 那么可以证明证书为真。因为本质还是CA私钥加密,你无法否认CA的身份,你是信任CA说法的,所以你也承认了证书的真实性。
6) 然后你就相信我是我吧?错!刚才你是看了官方签名,还没仔细看正文内容,正文里写的是:兹证明此人是李二蛋...... 我叫李刚啊,兄弟!如果证书证明我是我(李刚),则进入下一步。
7)你现在接手掌控全局了,你给出一个任意的字符串P
P的密文 = 加密算法(P,我的公钥) 注:我的公钥,是从证书里取出的。
P的明文 = 解密算法(P的密文,我的私钥)
这样没有第三个人能偷取这个P,只有我能解出这个P,而P是你给的,我做不了手脚。
8)本次会话的交互用P做秘钥,采取对称加密方式
信息X的密文 = 对称加密算法(信息X的明文,P)
信息X的明文 = 对称解密算法(信息X的密文,P)
这个P的有效期仅限于本次会话,下次会话又会变。你不相信在这么短的几秒,甚至几十毫秒内,别人破解这个秘钥,所以你相信信息是安全的。也就是没等敌人破解,又变秘钥了。
这个过程叫做SSL握手。它是建立在TCP握手成功之后的。因此可以SSL层看做是传输控制层之上的加密层。其它业务,建立在SSL层之上,例如http建立在SSL层之上,那么我们把SSL+HTTP组合称为https。同理,MQTT建立在SSL层之上,叫做MQTTs
后面有个问题要解决,CA公钥从哪里取?世界上有成千上万的网站,一家CA吃不下来。所以采取了分级CA的方法。例如:国家级CA,省级CA,地市级CA。我找地市级CA给我认证。地市级CA的身份由省级CA认证,省级CA的身份有国家级CA认证。
业务流程如下:
1) 【我的证书】的签发机构是济南市CA,你要下载【济南市CA证书】,里面有济南市CA公钥给你用。你做了验证通过。但是你心里想【济南市CA证书】万一下载了个李鬼怎么办?
2)你查看【济南市CA证书】的签发机构是山东省CA,然后你下载【山东省CA证书】,拿里面的山东省CA公钥给【济南是CA证书】做签名解密验证,发现成功了。但是你还是怀疑【山东省CA证书】下载了个李鬼,然后你就看到【山东省CA证书】的签发机构是国家CA
3)恰好呢,【国家CA】原本就在你的电脑里,你一直用它相信它,你做了最后一次验证,用国家CA的公钥验证【山东省CA证书】的签名。