此时,浏览器将要求其CA验证所给出的公钥是否真的属于该服务器。
根证书是如何在浏览器上进行验证的呢?
举个例子:假设serverX从CA“rootCA”获得了证书。浏览器本地存储有rootCA的副本。当浏览器联系serverX并收到其公钥+签名时,根CA将使用其私钥解密该签名并确保它确实来自serverX。
这就是它是如何工作的吗?
您的服务器创建一个密钥对,由私钥和公钥组成。当然,服务器永远不会泄露私钥,但每个人都可以获得公钥的副本。公钥嵌入到证书容器格式(X.509)中。该容器包含与封装密钥相关的元信息,例如服务器的IP地址或域名,服务器所有者,电子邮件联系地址,密钥创建时间,有效期限,可用于哪些目的以及许多其他可能的值。
整个容器由可信任的证书颁发机构(CA)签名。CA也拥有私钥/公钥对。您将证书交给他们,他们验证容器中的信息是否正确(例如,联系信息是否正确,该证书是否真的属于该服务器),最后使用其私钥对其签名。CA的公钥需要安装在用户系统上。大多数知名的CA证书已经包含在您最喜欢的操作系统或浏览器的默认安装中。
现在,当用户连接到您的服务器时,您的服务器使用私钥对一些随机数据进行签名,将该已签名数据与其证书(=公钥+元信息)打包在一起并发送给客户端。客户端可以用这些信息做什么呢?
首先,它可以使用刚刚接收到的证书中的公钥来验证签名数据。由于只有私钥的所有者能够以正确的方式签署数据,以使公钥可以正确验证签名,因此客户端将知道签署此数据的人也拥有接收到的公钥的私钥。
但是,如果黑客截取了数据包,并用不同的证书替换已签名数据并且还替换了证书,该怎么办呢?答案很简单,就是没有什么阻止它的措施。
这就是为什么在验证签名数据之后(或在其验证之前),客户端验证接收到的证书是否具有有效的CA签名。使用已安装的公共CA密钥,它验证已接收的公钥是否已经由已知且希望信任的CA签名。默认情况下,不信任未签名的证书。用户必须在浏览器中显式地信任该证书。
最后,它会检查证书本身的信息。IP地址或域名是否真的与客户端当前正在通信的服务器的IP地址或域名匹配?如果不匹配,就有可疑之处!
人们可能会想:有什么阻止黑客创建自己的密钥对,并将您的域名或IP地址放入他的证书中,然后让CA签署它?简单的答案是:如果他这样做,没有CA会签署他的证书。要获得CA签名,您必须证明您确实是此IP地址或域名的所有者。黑客不是所有者,因此他无法证明,并因此无法获得签名。
但是,如果黑客注册自己的域名、为其创建证书并由CA签署呢?这是可行的,他将获得CA签名,毕竟这是他的域名。但是,他不能用它来攻击您的连接。如果他使用这个证书,浏览器将立即看到已签名的公钥是为example.net域名,但它当前正在与example.com域名交流,不是相同的域名,因此再次出现问题。
服务器证书是用CA的私钥签名的。浏览器使用CA的公钥来验证签名。浏览器和CA之间没有直接通信。
重要的是,浏览器随附公共CA密钥。因此,浏览器预先知道所有可信任的CA。
如果您不理解这一点,请查阅非对称加密和数字签名的基础知识。
你的浏览器不会询问CA进行验证,而是在本地存储了根证书的副本,然后使用标准的加密程序来验证该证书是否真正有效。
这就是为什么当你自我签署证书时,你的证书是无效的,尽管技术上有一个CA可以询问,当然你可以将自签署CA复制到计算机中并从此信任自签署的证书。
CACert.org也有同样的问题,它拥有有效的证书,但由于浏览器没有它的根证书列表,所以其证书会生成警告,直到用户下载根CA并将其添加到其浏览器中为止。