之前给Tomcat中配置https协议,用的自己签的jks证书,对浏览器的警告从来都是忽略的。今天正好有空,就查了下数字证书的相关资料。算是基本弄清楚了,写这篇文章即是梳理也是分享。
场景
现在假设有两个人,男主和女主。男主有一对公钥和私钥,私钥自己保管,公钥给女主。当女主想给男主发信息时,为了不让其他人知道消息内容使用私钥对内容进行加密,然后发给男主。男主获得加密的消息后使用手中的私钥进行解密就可知道消息内容(公钥加密,私钥解密)。
现在有一个教导主任(黑客),为了抓学生早恋,但没有证据。虽然他能得到女主的消息,但这消息是加密的。即使他有男主的公钥也不能解密(公钥加密的内容不能通过公钥解密),怎么办呢?于是他重新生成了一对公钥和私钥,偷偷将女主手里持有的男主公钥换成了自己的公钥,女主在不知情的情况下用教导主任的公钥对消息进行了加密,消息传出去后被教导主任截获,然后他用自己的私钥解密消息,证据就这么到手了。
男女主为了应对这种情况,应该怎么办呢?现在的问题出在女主并不知道自己手中的公钥是谁的。于是他们向一个权威的联盟——比如说叫“学生联盟”求助。这个学生联盟是一个权威机构,并且和教导主任(黑客)对立。当然,“学生联盟”我们并不叫“学生联盟”,我们称作“证书中心”(certificate authority) 简称CA。“学生联盟”也有自己的一对公钥和私钥。男主把自己的信息和公钥给“学生联盟”,“学生联盟”用直接的私钥将相关信息和男主的公钥加密,加密后的内容就是“数字证书”(Digital Certificate)。女主只需持有“学生联盟”的“数字证书”就行(公钥在证书里),在需要加密消息时,先用“学生联盟”的公钥对数字证书解密,得到男主的公钥和男主的相关信息,如果相关信息不对就说明的这个解密后的公钥不是男主的。解密完后用得到的公钥对消息加密法出去,男主得到后就可以用自己的私钥解密了。
大概的流程如上。
看完后可能会有个问题:
1.既然主任(黑客)可以替换女主手里的男主公钥,那他也可以替换女主手里的“学生联盟”的公钥,这样不是一样吗?
答:上面只是一个例子,在实际情况中,“学生联盟”(CA)的公钥是一开始就内置在操作系统里面或者浏览器安装包里,浏览器或者操作系统是靠“受信任的根证书颁发机构”来分辨。当然如果主任(黑客)黑进了你的操作系统,那他就可以替换成自己的,这时候最好重装系统,所以保证自己的系统安全很重要。