写在前面
当我们要给网站配置https时,都需要申请 一个数字证书,然后将数字证书配置在网站上,如下可能配置:
<Connector port="446" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
scheme="https" secure="true" maxThreads="1500" minSpareThreads="500" maxSpareThreads="800" acceptCount="2000" enableLookups="false"
clientAuth="false" SSLProtocol="TLSv1.2" URIEncoding="utf-8" keystoreFile="D:\program_files\apache-tomcat-7.0.106-windows-x64-9999\apache-tomcat-7.0.106\conf\jc6server.jks" keystorePass="123456" />
本文就一起来看下,这个数字证书
到底是什么?为什么必须要配置数字证书?
1:正戏
Bob和Alice是好朋友,Eve是一个坏人,总是要想方设法破坏Bob和Alice的友谊,假定Bob想要约Alice出去玩,于是给Alice发送了如下消息:
但,我们知道,可恶的Eve出手了,从中做鬼,他拦截了Bob发送给Alice的消息,并进行了恶意修改,如下:
这样Alice收到了错误的消息,最终在错误的时间去到了错误的地点来等待他的好朋友Bob赴约,但,很明显,Alice是等不到Bob的。这很可能会影响到Bob和Alice的友好关系,那么能不能不让这种情况发生呢,是可以的,需要注意这种情况的原因是发送的消息是明文的,坏蛋Eve可以很轻松的拦截到并修改,因此,我们只需要发送加密消息就可以了,这里我们先使用对称加密,Bob将自己的公钥发送给Alice,这样Bob再发送消息的话就可以使用秘钥加密,然后Alice使用秘钥解密了,如下图:
看起来非常的完美,但真的是这样吗?很明显不是,我们要考虑这个对称加密的秘钥也是通过明文发送给Alice的,因此,这个过程很有可能被坏蛋Eve截获,Eve一旦有了秘钥就又能够堂而皇之的冒充Bob给Alice发送消息了,如下图:
可想而知,当Alice收到这个你是个大坏蛋,我不要和你玩!
的消息就要伤心死了,为了不让Alice伤心,我们需要继续升级。出现这个问题的原因是,Alice无法识别这个消息到底是不是Bob发的,那么只要能够让Alice有办法证明自己的身份就行了,这时候就需要我们的非对称加密算法了,Bob生成非对称加密的私钥(Bob独有)
和公钥(公开的)
,然后将公钥发送给Alice,之后在发送消息的时候,Bob使用自己的私钥对消息内容进行加密生成加密数据(这个加密数据就是数字签名,唯一证明,可以对比人类的指纹或者公章)
,如果中途Eve搞鬼,则Alice将无法正常解密数据(如RSA公钥解密错误密文会抛出异常javax.crypto.BadPaddingException: Decryption error)
,这样Alice就知道这不是Bob了,如下图:
到这里是不是就没有问题了呢,其实还是有的,问题依然出现在Bob明文传输自己生成的公钥上,此时,如果Eve足够聪明,会截获,然后将自己生成的公钥发送给Alice(这时候就可以使用自己的私钥来发送消息给Alice了)
,这样的话,因为Alice无法对Bob的消息验签,Bob反而不是Bob了,而不是Bob的Alice反而成了Bob了,那我们只要对公钥也加密传输不就完了吗?但要传输这个加密公钥就需要Alice现有这个加密公钥,不然解不了密(验签需要公钥)
,而Alice要有这个加密公钥就需要加密传输,如下图:
完蛋,死循环了,这种证明你妈是你妈
的问题还真是不太好搞的,此时该怎么办,破局的方式就是引入一个可靠的第三方,有它来提供可靠的公钥和私钥,利用此公钥和私钥,来完成Bob的公钥传输给Alice的工作,则死循环变为下图:
这里的三方就是CA(Certificate Authority)
机构,公钥和私钥是以文件的形式发放的,这个文件就叫做数字证书,如下我们可以查看百度的公钥数字证书:
这个时候,Bob就可以用自己的私钥来加密消息,生成签名并给Bob传递消息了,但还有一个问题需要解决,那就是这个私钥加密的过程会涉及到复杂的计算过程,如果是Bob发送给Alice的消息很大的话,加密的效率可能会比较低,为了解决这个问题,需要将消息转换为一个较小长度的字符串(如MD5生成长度固定为218bit的字符串)
,然后再对该字符串加密生成加密消息,即数字签名,如下图:
其中这个经过原始消息转换而成的固定长度的字符串我们叫做是摘要
,除了生成数字签名之外,一般还会用来验证文件的完整性。
写在后面
小结
本文以明文传输为切入点,通过引入不同的问题,逐步介绍了,对称加密,非对称加密,摘要,数字签名,数字证书等内容。希望本文能够帮助到你。
参考文章列表
数字签名、数字证书与HTTPS是什么关系? 。