概要
http://blog.csdn.net/wsdxsyb/article/details/61192075
http://www.jianshu.com/p/4833c9d7f16f
http://www.jianshu.com/p/c8e86f62687a
http://www.cnblogs.com/lrr0618/p/5388350.html
https://www.sidoc.cn/doc/write/1/167
http://www.cnblogs.com/lrr0618/p/5388350.html
http://blog.csdn.net/kuangdacaikuang/article/details/52983920
根证书
从技术上讲,证书其实包含三部分,用户的信息、用户的公钥、CA中心对该证书里面信息的签名。验证一份证书的真伪(即验证CA中心对该证书信息的签名是否有效),需要用CA 中心的公钥验证,而CA中心的公钥存在于对这份证书进行签名的证书内,故需要下载该证书,但使用该证书验证又需先验证该证书本身的真伪,故又要用签发该证书的证书来验证,这样一来就构成一条证书链的关系,这条证书链在哪里终结呢?答案就是根证书,根证书是一份特殊的证书,它的签发者是它本身,下载根证书就表明您对该根证书以下所签发的证书都表示信任,而技术上则是建立起一个验证证书信息的链条,证书的验证追溯至根证书即为结束。所以说用户在使用自己的数字证书之前必须先下载根证书。
为了确保安全,很多涉及在线交易的网站都会使用SSL技术对页面内容进行加密。SSL技术的主要用途有两个:
- 确保服务器和用户浏览器之间的通讯不被窃听:一个SSL证书分为两部分:公钥和私钥。私钥会被网站所有者妥善保管,并在服务器端用私钥将网络通讯全部加密;公钥会在网上广为传播,公钥加密后的数据只有对应的私钥才能解密。因此只要SSL证书本身可以保证安全,那么在访问网站时就可以保证网络通讯不被他人所窃取。如果有人进行中间人攻击,因为没有相应的密钥,导致篡改后的数据无法通过校验,因此可以及时察觉。
- 确保网站所宣称的身份真实可靠:网上有个网站叫支付宝,可如何保证这个网站就是那个真正的支付宝,而不是其他人伪造的钓鱼网站?因此真正的支付宝可以使用SSL证书,这种针对企业用的证书的申请手续比较繁琐,有一大堆审查流程,需要提交大量相关的证明文件,因此可以保证只有真正的某公司才能以这个公司的名义申请证书,只要申请到证书,就可以确信身份的可靠。
我们凭什么信任这个证书颁发机构?
证书只是说明证书持有人的身份是真实可靠的,至于持有人用这个证书干什么事情,不在“信任”的范畴内。例如,网上很多臭名昭着的恶意软件,现在都带有数字证书(倒是很多正规用途的软件因为开发商缺乏安全观念不带证书),同时因为这些数字证书的“根”都是我们信任的根证书颁发机构,因此,操作系统和浏览器是信任这些公司的身份的,但并不代表这些公司的软件不会干坏事。只要肯花钱,任何人都可以在商业性质的证书颁发机构买到直接被我们的系统所信任的证书。
其实Windows和任何操作系统本身就包含一些受信任证书颁发机构的根证书,要查看这些根证书,可以运行“certmgr.msc”打开证书控制台,然后从控制台窗口左侧的控制台树中依次进入“证书-当前用户”→“受信任的根证书颁发机构”→“证书”,随后右侧的窗口中会显示本机预置的所有根证书颁发机构,其中就有“CA – G3”,这表示我们信任“CA – G3”,而“CA – G3”信任“www.alipay.com”,因此我们可以信任“www.alipay.com”。如果从证书控制台中删除“CA – G3”的根证书,表示我们不再信任它,那么它所信任的公司也将不再被我们信任。
按照上文的方法打开证书控制台,并进入到“不信任的证书”→“证书”节点后,还会发现里面列出了多个颁发给大量知名企业的证书,例如Microsoft、Google、Skype、Yahoo等。为什么会不信任这些大牌互联网企业?就是因为某家根证书颁发机构被黑客攻破,导致这些大企业所用的证书私钥被窃取。因此为了保证安全,这些被盗证书已经被吊销。因而将原本被盗的证书都添加到“不信任的证书”节点下,这样盗取证书的黑客就算使用这些证书给病毒签名,伪装成这些大企业,也会因为证书吊销的缘故不会让人轻易上当。这家倒霉的公司就是荷兰的DigiNotar,该公司因为这次事件现在已经破产,而从中也足以证明证书吊销机制的重要性。这一点会在下文详细介绍。微软已经通过KB 2607712补丁将受影响的证书全部设置为不信任。
全世界提供数字证书业务的公司有很多,而Windows自带的“根证书”很少。默认情况下,我们是如何信任这么多不同公司颁发的不同证书的?其实这就是“根”这个字的含义,因为可以颁发证书的公司虽然很多,但最基本的根证书颁发机构只有几个,默认情况下都是被操作系统所信任的。那么既然操作系统能信任根证书颁发机构,自然也就可以信任被根证书颁发机构信任的公司,进而可以信任被这些公司所信任的下一级公司。
而铁道部的在线订票网站并没有走这个一般意义上,涉及金融交易的商业化网站都严格遵守的方法。也就是说,铁道部并没有花钱在商业性质的CA(证书颁发机构)购买受信证书,他们直接自己给自己颁发证书。这样的做法一般主要是用于测试或学习等非正式场合,但如果一个商业化网站想要正式上线运营,通常并不会这样做,因为对用户来说风险太大。
12306.cn网站所用的证书默认也不会被任何一个系统所信任。因而铁道部要求安装根证书的原因,就是让访客将这个证书手工添加到“受信任的根证书颁发机构”节点下。
很遗憾的是,这种做法虽然很不安全,可国内的大佬们很喜欢使用。例如在我的系统中,这里就有建行和工行网银自行添加的根证书。
HTTPS在传输数据之前需要客户端与服务端之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。握手过程简述如下:
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,公钥,以及证书的颁发机构等信息。
3.获得网站证书之后浏览器要做以下工作:
a) 验证颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等。如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.服务器接到浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。