论不同系统和客户端的证书管理

    上面刚说完x509证书链系统,现在我们说说各种系统和客户端下的证书管理吧。理论上说,系统只要保留一份根证书系统,其余的会自动进行计算。但是杯具的是,不同系统的不同应用,使用的是不同的数据库。这导致你的根证书导入之路漫漫而修远。

windows系统:
1.系统证书管理
    在运行中输入certmgr.msc,就可以看到证书管理系统了。根证书管理在“受信任的根证书颁发机构->证书”下面。对证书文件进行查看,导入,然后导入到这个区域,就可以变成根证书了。要吊销一份证书,删除是不行的,因为会自动加回来。加入“不受信任的证书”好像也无效。我找到的比较实用的方法是右击看属性,“停用这个证书的所有目地”。再试试看?证书应当无效了。

2.firefox
    火狐的证书系统是独立于系统证书的,因此在windows中做的修改对firefox无效。需要到“选项->高级->加密->查看证书”中(windows下在工具菜单下),在“证书机构”选项卡,导入证书,而后启用所有用途,让证书生效。如果要吊销,跑到同一个地方,删除证书,或者编辑,取消所有用途。需要注意的是,当你删除证书后,再次查看证书列表时,证书会回来。但是此时编辑证书,可以看到,所有用途都被取消了。

3.chrome
    chrome在windows下使用系统证书,因此不要用chrome自身的证书管理系统,直接修改系统证书就可以。

linux系统(debian):
1.系统证书管理
    运行dpkg-reconfigure ca-certificates,会出现让你配置系统证书的界面。这是系统的证书数据库,自动配置的话好像不能添加,只能取消。你反选某个选项后,/etc/ca-certificates.conf中,对应这个选项的行在行首就会出现!。此时系统内就不再认可这份证书。因此推测,如果你需要自己加入一份证书,需要将证书添加到合适位置,编辑/etc/ca-certificates.conf,加入路径,再执行dpkg-reconfigure ca-certificates或者update-ca-certificates进行更新,此时程序会更新/etc/ssl的某些内容,证书就安装上去了。

2.firefox
    同样是独立于系统的配置,基本操作和windows差不多,不过linux下面“选项”在“编辑”下面。
3.chrome
    linux下面的chrome可以在“首选项->高级->证书管理器”中,选择“授权中心”。导入后修改权限即加入。注意需要使用禁用,而非删除对应证书,来阻止某些证书。

    这里面说的加入证书,基本是加入自己的证书。至于移除,基本说的是cnnic。cnnic证书有什么危害?目前没有。如果你相信中国的互联网是世界上最开放的互联网,那么下面一堆不看也罢。不过,如果你不相信中国政府颁发出的证书,还是移除的好。在系统内保留一个不受信任的根证书,可能受到证书替换钓鱼。简单来说,你访问一个安全网站的时候,这个网站的证书是如何颁发的,你留心过么?在地址栏网站logo那里右击,查看证书,再找到证书链,你就可以看到,这个证书属于谁,是谁颁发的,这样一个链条。想象一下,你在用gmail的时候,心血来潮看了看域名证书,发现颁发者是CNNIC SSL(google的颁发者是Thawte)。很明显,你访问的网站不是真的gmail,而是一个伪装的网站,将你的请求再转到gmail服务器上。这个网站没有gmail的证书,不过用CNNIC签了一个。于是你的所有请求,收到的邮件内容,发出去的内容,全部被公开了。你也不知道这个替换什么时候进行的,由于安全验证可以通过,系统也没有警告你。是不是有种看到日本恐怖片里面,贞子爬出屏幕的感觉?

    当然,这个是一个特例,有点危言耸听。因为对于某些国外CA,证书也是乱发的。基本只要交钱,给一份材料复印件,一样可以通过审查,得到一本CA证书。然而,这种证书通常比较容易被发现,CA也会很快吊销这些证书。如果不是这样,这些CA往往也会被各种系统加入吊销名单。不过对于蓄意产生的CA证书么,就难说的很了。附上一个用于检测CNNIC证书的网站,https://www.enum.cn/

    另一个风险证书则是comodo,早些时候,这个公司被黑客入侵,导致黑客给自己签发了一堆证书。虽然目前这些证书已经被吊销,不过这种安全公司让人一点信任感都没有。最好果断删除。

说说x509证书链

    x509证书一般会用到三类文件,key,csr,crt。key是私用密钥,openssl格式,通常是rsa算法,爱咋用咋用的。csr是证书请求文件,用于申请证书。在申请的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。crt是证书文件(windows下面的csr,其实是crt),是签署人用自己的key给你签署的凭证。通常签名证书的时候都需要一个序列号,避免两个证书重复,当指明序列文件后,被签名证书会使用这个文件,并且文件会发生变化。另外一个额外说明的东西是dh参数,做openvpn的时候需要这个东西,大致是什么算法的初始参数,在下面有生成方法。

key的生成方法:
openssl genrsa -des3 -out in.key 2048
    这样是生成rsa私钥,des3算法,openssl格式,2048位强度。ca.key是文件名。
    为了生成这样的密钥,需要一个至少四位的密码。可以通过以下方法去除。
openssl rsa -in in.key -out out.key
    输入密钥后,out.key就是没有密码的版本了。

csr的生成方法:
openssl req -new -key server.key -out server.csr

    需要依次输入国家,地区,组织,email。最重要的是,有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。

crt生成方法:

openssl x509 -md5 -days 3560 -req -CA ca.crt -CAkey ca.key -CAcreateserial -CAserial ca.srl -in server.csr -out server.crt

    输入key的密钥后,完成证书生成。-CA选项指明用于签名的ca证书,-CAkey选项指明用于签名的密钥。-CAserial指明序列号文件,而-CAcreateserial指明文件不存在时自动生成。

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

    这个是用于生成自签名证书的。

dh参数生成方法:
openssl dhparam -out dh1024.pem 1024
    1024是位数,一般1024已经够了。

    x509的证书链是这样的。crt上有证书持有人的信息,持有人的公钥,签署者的签名。当你安装了一个证书后,就信任了这份证书。证书上会说明用途,例如服务器认证,客户端认证,或者签署其他证书。当系统收到一份新的证书的时候,证书会说明,是由谁签署的。如果这个签署者确实可以签署其他证书,并且收到证书上的签名和签署者的公钥可以对上的时候,系统就自动信任新的证书。
    在系统开始的时候,会自动安装信任一些证书机构,这些被称为根证书机构(CA)。根证书机构会为其他公司颁发证书,用于各种用途。当然,被签署的证书也可能是一份“可签署证书”,这样就要检查对方的资质。这样逐层签署,就会形成一个叫做“证书链”的东西。从拓扑结构上来说,其实应该是森林结构。

    当然,如果我们要弄ssl,又没有钱请CA给我们签署的时候(他们的验证费都好贵的),可以考虑自己给自己签署。生成一份key,生成一个req,然后用自己的key签署自己的req。当你使用这份证书做ssl的时候,就会产生不受信任的证书警报。你可以在客户那里安装这张证书为根证书,就不会弹出这个警告了。当然,考究的人,签署用证书和服务器身份认证证书要分开。先做一个自签署证书作为根证书,然后用这个根证书签署一个服务器证书。这样在客户那里安装根证书后,服务器证书就会自动信任。这样的好处是,一本证书只能颁发给一个特定域名。如果你有多个域名,就要反复在客户这里安装证书。然而如果采用根证书签名,那么只要安装一张根证书,其他都是自动的。不过如果事情只要干一次,就不用讲究这么多了。

CNNIC的证书

最近,技术圈里面在争论CNNIC的证书被加入到信任根证书里面的问题。本文章试图和专业人士探讨这一变化的过程,以及向非专业人士说明会造成的影响。所有段落前会标明针对的群体。
事情的起源,是有人发现CNNIC的证书被加入了Mozilla和系统的信任根证书链里。这引发了大家对早年CNNIC所做的流氓软件的回忆,因此大量技术人士强烈反对。所做的反应包括发起BUG讨论提请Mozilla删除CNNIC的证书,发起投票,写信给Entrust阐述问题等。下面会简述一下信任根证书链,还有CNNIC的背景和历史。
本段适合非专业人士阅读。我们在访问一个网页的时候,通常有两种常见的通讯方式。http和https。区别在于,https会使用网站证书加密通讯过程。证书加密包含了几重的意义,首先,证书保证了你们的通讯没有第三者能截获。其次,证书验证了你访问的网站,是否是他号称的那个网站。也许很多人无法理解,这两种攻击怎么可能发生。要理解一点,中国电信也不是铁板一块,你完全无法指望他们的员工也绝对安全。否则的话,为什么所有银行都使用https来加密访问过程呢?
本段适合专业人士阅读。那么,不使用证书会发生如何的攻击呢?一旦有某个人更改DNS(这东西让百度都吃了亏),以某个服务器替换了你的银行(或者gmail)。那么,你访问你的目标域名的时候,就会被定位到他的中间机器上,他再使用代理技术,通过ssl访问目标服务器。整个过程如同走代理一样,唯一的问题就是你的密码泄露了。那么证书是如何防御这个攻击的呢?如果你访问目标机器,目标机器会让你验证一份证书,标明他的域名(用于防止域名劫持的),签署者。一旦域名不符合,或者你不信任证书,就会报警。那么攻击者如何复制这个证书呢?首先他无法通过访问的方式获得证书原文,因为证书给你的其实只有公钥部分。其次他无法将这个过程也代理下来,因为如果这么做,下面的内容就全是不可解的了,那他就纯粹花钱把自己弄成代理服务器了。最后,他也无法生成,因为按照规定,只有域名的拥有者可以向特定的单位申请证书。于是,他无法复制证书,攻击就会失败。
本段适合非专业人士阅读。然而,你需要信任什么证书呢?如果你要一家一家的信任证书,会发生什么?你见到是否信任就会习惯的去点,这对安全于事无补。因此,这里引申出一个证书链的问题。通常系统内内置了一些证书,这些证书叫做信任根证书。这些证书的权限是,可以让你信任其他证书。而被他们授权的证书,则分为可以继续授权和不可以继续授权两种。一旦被他们签署授权的证书,最起码你访问的时候不会有警告了。现在,CNNIC加入了这个根证书链。那CNNIC是个什么公司呢?他自称是中国科学院下属的中国互联网络信息中心,服务于科学和研究的机构,但很多人指出CNNIC的直接主管是工信部。当年,CNNIC推出中文域名服务,这项服务需要在几乎所有人的电脑内安装插件。他为了提高安装率,使用了不可删除的保护技术。这导致很多人的电脑安装后,无法卸载程序。至于安装呢?也不全是自愿安装(我不排除自愿者,绿霸还有自愿的呢)。他们曾经利用系统漏洞,向大量电脑上强行安装插件。而且CNNIC还借助官方身份,大量推行中文域名——其实他们根本就不是政府机构,而是非营利机构。并且,在前两年拼命忽悠CN域名,最近又突然停止域名解析(虽然是国家规定的),道歉赔偿啥都没有。大家自己想,真的可以信任这种公司么?
本段适合所有人阅读。现在CNNIC已经进入了信任根证书链,如果配合国家级的DNS劫持技术,理论上可以构造一个假的mail.google.com,或者www.hotmail.com。走代理,自己给自己签署一个证书。从而获得你的完整会话。这里(http://autoproxy.org/zh-CN/node/66)有比较大的说明和讨论。
我对这个事情的观点是。作为Mozilla或者任何根证书的发行机构,在没有直接证据的情况下,不大可能拒绝一个国家级机构的要求。然而,无论任何原因,信任一个机构,就代表你要为他的行为负责。如果CNNIC做出任何危害用户安全的行为,Moziila,微软,Debian.org会被我作为同罪者考虑和抵制。同时,系统发行的根证书系统,是否要去信任,是我们每个人的问题。如果你觉得CNNIC根本不值得信任,那么你可以删除他的所有证书,以及签署了他的所有证书。目前而言,我删除了CNNIC和Entrust的所有证书。