数字签名的一种应用:证书颁发机构CA如何通过SSL/TLS证书防止网站伪造与信息窃取
1.引言:浏览器通过域名访问服务器时,存在的安全风险——网站伪造与信息窃取
DNS服务器中记录了由域名到IP地址的映射。DNS服务器如果被攻陷,那么域名对应的IP地址可能会改成攻击者的服务器IP地址,从而让攻击者可能冒充合法网站并窃取用户信息。
这产生了一个问题:那怎样确保我访问的网站不是攻击者假冒的呢?
2.解决方案:证书颁发机构CA如何通过SSL/TLS证书防止网站伪造与信息窃取
2.1 前置知识: 加密,公钥与私钥、证书颁发机构CA与SSL/TSL证书、数字摘要
- 加密:加密是让一段人类可读的纯文本(明文)处理为人类不可读的随机字符的过程(密文)。密文通过一定的手段可以转化为铭文。加密和解密的线索叫做密钥。用key1加密plaintext成ciphertext过程可以标记为`ciphertext = encrypt(text, key1)`,用key2对ciphertext解密成plaintext的过程可标记为`plaintext=decrypt(ciphertext,key2)`。加密密钥和它对应的解密密钥之间并没有必然的联系,其中,若相同为对称加密,若不同为非对称加密。
- 公钥与私钥:公钥和私钥是非对称加密中的概念。公钥和私钥本质上是一串数字,以文件的形成存储在终端。每一台终端都有自己独有的公钥和私钥,其中公钥所有人可见,私钥仅自己持有可见。当用公钥对文本进行加密的时候,私钥就是解密密钥,能够将公钥加密成的密文解密为初始时的明文;同时,当用私钥对文本进行加密的时候,公钥就是解密密钥,能够将私钥加密成的密文解密为初始时的明文
- 数字摘要:对一段文本求哈希值,此哈希值是该文本的数字摘要,即`value=hash(text)`。我们会说该值是该文本的指纹或数字摘要,因为只有该文本才能得到该值,不是这段文本就得不到该值。这是由哈希函数的特点决定的,特点是:
- text改变,value也变。
- text很冗长,但是value可以很简短,简短到如256有16进制字符
2.2 SSL/TSL证书的作用原理:证书证明该服务器是该域名指向的合法(非冒充的)服务器的原理
为了解决引言中提到的安全风险,出现了证书颁发机构(certificate authority,CA)的概念。证书颁发机构是有公信力的第三方机构,它会向该域名所指向的合法的服务器颁发一个证书,这个证书就是SSL/TSL证书。证书是该服务器是该域名指向的合法服务器的证明文件。换句话说,这个证书能够证明,`当前访问的网站不是攻击者假冒的`。证书内容简单认为是这样的元组(域名,服务器公钥,CA名称,CA的数字签名)。每当客户端访问该服务器时,向该客户端发送此证书。
证书的服务器公钥字段标识了一个特定服务器。(证书的服务器公钥字段,域名)这组映射关系的想说明的是该服务器是该域名指向的合法服务器。CA担保了这件事。CA机构是大家都认可的受监管的第三方机构,因此我们相信CA的担保,因此我们相信服务器合法拥有该域名。现在残存的疑问由两个,一个是证书是的形成过程是怎样的?二是客户端是如何验证SSL/TSL certificate是否确实为CA颁发的。这个两个知识后面会提到。
2.3 引入SSL/TSL证书后,客户端访问一个特定域名的过程
2.3.1 初始条件
- CA:CA向此特定域名指向的合法的服务器颁发了SSL/TSL certificate
- 服务器:持有SSL/TSL certificate
- 客户端:用户在浏览器中输入该域名。
2.3.2 访问过程
访问一个域名的过程就会这样的:
- 用户在浏览器中输入该域名后,DNS服务器返回这个域名的服务器IP地址。
- 根据服务器IP地址访问服务器,服务器向出示拥有该域名的SSL/TSL certificate
- 用户验证SSL/TSL certificate是否确实为CA颁发的。若是,则可以认为此网址为真,进行正常访问。
2.4 SSL/TSL certificate的形成过程
-
服务器向 一个CA机构提交一个证书申请。这个申请包括了两个字段(域名,服务器的公钥,申请机构名称)
-
CA机构验证该服务器的资质,验证通过后执行第三步。
-
CA机构以(域名,服务器的公钥,申请机构名称)输入到一个哈希函数,将该值记为fingerprint,对fingerprint用CA机构的私钥加密,结果记为certificate(即,数字签名),把certicate附在证书后。把完全体的证书发给服务器。
-
服务器保存(域名,服务器公钥,CA名称,CA的数字签名)这个SSL/TSL certificate。每当服务器被访问时,发送该证书给客户端。
2.5 客户端验证SSL/TSL certificate是否确实为CA颁发的具体过程
- 客户端根据SSL/TSL certificate中授予改证书的机构名称字段,在浏览器等地方查询该机构的公钥
- 执行 if hash(SSL/TSL certificate) == decrypt(certificate, CA 公钥CA公钥(CA名称)),如果为True则验证通过。
- 如果为FALSE,有两种情况:
- 从`==`左边看:可能是hash值与fingerprint不同了,表明证书被篡改,因此此服务器无法被信任
- 从`==`右边看:更可能是该机构没有用私钥对fingerprint加密过。也即,机构没有对该证书签名。
3. 证书是否有伪造的可能性的讨论:对验证过程的核心步骤即if判断的进一步理解
不可能。
我对伪造进行一个定义:对于攻击者来讲,他的目的是制作一个SSL/TSL certificate,其中的公钥字段为自己服务器的公钥,且让`if hash(SSL/TSL certificate) == decrypt(certificate, CA公钥(CA名称))` 判断结果为True。
用反正法,证明不可能:
假设:攻击者制作的证书符合`hash(SSL/TSL certificate) == decrypt(certificate, CA公钥(CA名称))`为True
设hash(SSL/TSL certificate) == fingerprint 则decrypt(certificate, CA公钥(CA名称)) == fingerprint 等价于 certificate == encrypt(fingerprint, CA私钥), 由于正确的certifacate给出了,则CA私钥已知。这与CA私钥只有CA机构持有,为未知的相矛盾。因此无法伪造证书。
4.整个过程的简单理解:不涉及技术细节
一个第三方机构在内容是该服务器持有该域名的条子上签了字,并且这个条子放在了服务器上。有人访问通过域名访问该服务器的时候,服务器出示该条子。这个人通过验证该条子上的签字确实是该机构的,从而信任该条子上的内容。
更多推荐

所有评论(0)