作者:David Youd

翻译:阮一峰  


其他:

如何保证公钥不被篡改?

答:将公钥放在数字证书中,只要证书是可信的,公钥就是可信的。

公钥加密计算量太大,如何减少耗用时间?

答:每一次对话(session),客户端和服务器都生成一个对话密钥(session key),用它来加密信息,由于“对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密“对话密钥”本身,这样就减少了加密运算的消耗时间。

因此SSL/TLS协议的基本过程是:

1)客户端向服务器索要并验证公钥(握手阶段,明文)

2)双方协商生成“对话密钥”(握手阶段,明文)

3)双方采用“对话密钥”进行加密通信

握手阶段详解:

Anroidjks证书查看公钥 证书和公钥_数字证书

1)客户端发出请求(ClientHello)  并提供如下信息

a 支持的协议版本,例如TLS 1.0
b 客户端生成的随机数,用于生成“对话密钥”
c 支持的加密方法,例如RSA公钥加密
c 支持的压缩方法

2)服务器回应(SeverHello)

a 确认使用的加密通信协议版本,如果客户端与服务器支持版本不一致,服务器关闭加密通信
b 服务器生成的随机数,用于生成“对话密钥”
c 确认使用的加密方法
d 服务器证书


3)客户端回应

客户端验证服务器证书,若证书问题,显示警告是否继续通信。

若证书安全,客户端从证书中提取公钥,向服务器发送如下信息:

a 随机数(用公钥加密,防止窃听)【第三个随机数,又称"pre-master key",三个随机数+加密方法 生成session key】
b 编码改变通知,表示随后的信息都将用双方协商的加密方法和密钥传输
c 客户端握手结束通知,表示客户端的握手阶段结束,同时包括hash值,供服务器校验


4)服务器回应


服务器生成 session key ,并发送如下信息:


a 编码改变通知,随后的信息都将使用双方协商的加密方法和密钥传输
b 服务器握手结束通知,表示服务器的握手阶段结束,同时包括hash值,供客户端校验

//


1、鲍勃有两把钥匙:公钥和私钥

Anroidjks证书查看公钥 证书和公钥_数字证书_02


 

2、鲍勃把公钥送给朋友们:帕蒂、道格、苏珊,每人一把

Anroidjks证书查看公钥 证书和公钥_Anroidjks证书查看公钥_03


 

3、苏珊要给鲍勃写一封保密信件,她写完后用鲍勃的公钥加密,就可以达到保密的效果

Anroidjks证书查看公钥 证书和公钥_Anroidjks证书查看公钥_04


 

4、鲍勃收到邮件后,用私钥解密,就可以看到邮件的内容。

(注意:只要鲍勃的私钥不泄露,这份邮件就是安全的,即使落在别人手里,也无法解密)

Anroidjks证书查看公钥 证书和公钥_服务器_05


 

5、鲍勃给苏珊回信,决定采用“数字签名”,他写完后先用Hash函数,生成信件的摘要(Digest)

Anroidjks证书查看公钥 证书和公钥_数字证书_06


 

6、然后,鲍勃使用私钥,对这个摘要进行加密,生成“数字证书”(signature)

Anroidjks证书查看公钥 证书和公钥_Anroidjks证书查看公钥_07


 

7、鲍勃将这个签名,附在信件下面,一起发送给苏珊

Anroidjks证书查看公钥 证书和公钥_数字证书_08


 

8、苏珊收件后,取下数字证书,使用鲍勃的公钥解密,得到邮件的摘要,由此证明,这封信确实是鲍勃发出的。

Anroidjks证书查看公钥 证书和公钥_Anroidjks证书查看公钥_09


 

9、苏珊再对信件本身使用Hash函数,将得到的结果与上一步得到的摘要进行对比,如果两者一致,说明邮件未被修改过

Anroidjks证书查看公钥 证书和公钥_服务器_10


 

10、复杂情况:道格想欺骗苏珊,他偷偷使用苏珊的电脑,用自己的公钥替换鲍勃的私钥。

此时,苏珊实际拥有的是道格的公钥。

因此,道格可以冒充鲍勃,用自己的私钥做成“数字证书”,写信给苏珊,让苏珊用假的鲍勃的公钥进行解密。

Anroidjks证书查看公钥 证书和公钥_数字证书_11


 

11、后来苏珊发觉不对劲,发现自己无法确定公钥是否属于鲍勃。

她想到一个办法:要求鲍勃去找“证书中心”(certificate authority,简称CA),为公钥做认证。

证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成数字证书(Digital Certificate)。

Anroidjks证书查看公钥 证书和公钥_Anroidjks证书查看公钥_12


 

12、鲍勃拿到数字证书后,就可以放心给苏珊写信了,只要在签名的同时,附上数字证书即可。

Anroidjks证书查看公钥 证书和公钥_服务器_13


 

13、苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃的真实公钥,以此判断数字证书是否鲍勃的。

Anroidjks证书查看公钥 证书和公钥_Anroidjks证书查看公钥_14


 

14、以HTTPS协议为例,了解数字证书的应用,主要用于web加密

 

15、首先,客户端向服务器发出加密请求。

Anroidjks证书查看公钥 证书和公钥_数字证书_15


 

16、服务器用自己的私钥加密网页后,连同本身的数字证书,一起发送给客户端

Anroidjks证书查看公钥 证书和公钥_数字证书_16


 

17、客户端的证书管理器,有“受信任的根证书颁发机构”列表。

客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

Anroidjks证书查看公钥 证书和公钥_数字证书_17


 

18、如果数字证书记载的网址,与当前浏览的网址不一致,就说明该证书可能被毛用,浏览器发出警告。

Anroidjks证书查看公钥 证书和公钥_服务器_18


 

19、如果这张证书不是由受信任的机构颁发的,浏览器就会发出另一种警告。

Anroidjks证书查看公钥 证书和公钥_客户端_19


 

20

Anroidjks证书查看公钥 证书和公钥_数字证书_20


 

总结:公钥和私钥是成对的,它们互相解密。

公钥加密,私钥解密。

私钥数字签名,公钥验证。