Chrome浏览器的证书管理

Chrome浏览器的证书管理

作者:千里孤行(http://blog.****.net/yanghehong)

当浏览HTTPS开头的网站时,网站的服务器会发一个数字证书过来,浏览器和人需要对其做有效性验证。这个过程中,需要从本地的证书库里头找出证书的颁发机构(certificate authority ,CA)的证书来对网站服务器的证书做验证。这些CA的证书是浏览器厂商预装的或是用户后来设置导入的。

不过GoogleChrome浏览器比较特别,不像其他 独立浏览器Firefox, Opera这些有自己独立的证书库。Chrome浏览器的证书管理,其实就是不管理。Chrome浏览器跟IE浏览器一样,使用Windows系统的那一揽子东西。

Chrome浏览器的证书管理

当点击Chrome的“高级选项->管理证书”时,Chrome直接把IE那个证书管理对话框弹出来了:

Chrome浏览器的证书管理

下载了Chrome浏览器的源码下来看。挺庞大的,压缩包就800M,解压后2G多。

找到用户界面 高级设置 部分的代码:

Advanced_contents_view.cc (chromium/src/chrome/browser/views/options)

当用户“管理证书”按钮按下事件的处理:

void SecuritySection::ButtonPressed(

views::Button* sender, const views::Event& event) {

} else if (sender == manage_certificates_button_) {

UserMetricsRecordAction("Options_ManagerCerts", NULL);

CRYPTUI_CERT_MGR_STRUCT cert_mgr = { 0 };

cert_mgr.dwSize = sizeof(CRYPTUI_CERT_MGR_STRUCT);

cert_mgr.hwndParent = GetWindow()->GetNativeWindow();

::CryptUIDlgCertMgr(&cert_mgr);

}

}

直接调一个CryptoAPI的函数,弹出一个IE的证书管理对话框就不理了,让Windows自己去保存设置/处理。所以看到的效果跟IE一样。

再看下SSL客户端部分的代码,

Ssl_client_socket_win.cc (chromium/src/net/socket)

基本上是这样,当浏览HTTPS网站,需要验证服务器证书的时候,Ssl_client调用了若干WindowsCryptoAPI 接口,来对证书做验证:

CertOpenSystemStore()

InitializeSecurityContext (Schannel)

QueryContextAttributes (Schannel)

CertGetCertificateChain()

CertVerifyCertificateChainPolicy()

使用的是Windows的系统证书存储区(system certificate store)Chrome自己不需要管理CA。也许Chrome浏览器项目太赶或是人手不够所以还没有自己独立实现这一部分吧。