PKI、CA、SSL、HTTPS、数字证书、数字签名简介

这篇文章主要是从网上的一些资料整理而来,主要参考了下面一些连接:
http://3layer.blog.51cto.com/57448/20430/
http://www.guokr.com/post/114121/
http://www.guokr.com/post/116169/
http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html

非对称加密算法中,用户可以有两种方法获取公钥:1.直接问对方要 2.问CA要

比如我A要向B传递一个数据,这个数据要加密,那么A就拿着公钥对其加密,然后把加密的数据给B,B用私钥解密就行了。

另外公钥、私钥还有一个作用就是做签名。比如B想告诉A去做某件事,A怎么知道收到的那个报文确实是B发送出来的呢?由于A知道只有B有私钥,所以只要A收到的报文里边包含的签名信息可以确认是私钥签名过的就行了。

那签名的原理是什么呢?很简单。公钥和私钥是可以互换的(数学上决定的)。普通的机密传输是PUBLIC_KEY(Data)加密,然后PRIVATE_KEY(PUBLIC_KEY(Data))。签名的话就是我先对Data用私钥加密:PRIVATE_KEY(Data),然后对方用公钥解密:PUBLIC_KEY(PRIVATE_KEY(Data))。但签名的话Data和PRIVATE_KEY(Data)都是要传送的,然后会比较解密的Data和Data是否相同。所以这里Data是明文。

也就是说,用公钥加密是为了加密,用私钥加密是为了签名。

数字证书:包含了公钥,同时包含了身份信息。数字证书绑定了公钥及其持有者的真实身份。
颁发过程:
数字证书颁发过程一般为:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构发布。数字证书各不相同,每种证书可提供不同级别的可信度。可以从证书发行机构获得您自己的数字证书。

证书的格式是由X.509标准定义。

HTTPS的请求流程:
1.客户端浏览器发出请求
2.服务器返回一个公钥证书。该证书有CA机构XXX签名过(也就是XXX用XXX的私钥签名过)
3.浏览器验证这个证书。浏览器想知道的只是说,这个证书是不是由CA XXX认证的,因为浏览器相信CA。至于服务器的那个公钥啥信息它不怎么在乎,只要CA XXX说ok,那就ok了。
4.如果认证OK,就中证书中的公钥加密一个对称密码,发送给服务器
5.之后就使用这个对称密码进行通信

那么对于第3步,浏览器是如何认证CA没问题的呢?主要是:
证书以证书链的形式组织,在颁发证书的时候首先要有根CA机构颁发的根证书,再由根CA机构颁发一个中级CA机构的证书,最后由中级CA机构颁发具体的SSL证书。我们可以这样理解,根CA机构就是一个公司,根证书就是他的身份凭证,每个公司由不同的部门来颁发不同用途的证书,这些不同的部门就是中级CA机构,这些中级CA机构使用中级证书作为自己的身份凭证,其中有一个部门是专门颁发SSL证书,当把根证书,中级证书,以及最后申请的SSL证书连在一起就形成了证书链,也称为证书路径。在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级的进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信。根证书是最关键的一个证书,如果根证书不受信任,它下面颁发的所有证书都不受信任。操作系统在安装过程中会默认安装一些受信任的CA机构的根证书,可以在“运行”里面运行“certmgr.msc”启动证书管理器。

也就是说,CA的根证书我们是有的,然后我们用CA根证书里边的公钥去看看浏览器拿到的证书是不是由该CA签名的。如果是就ok了。
如果我们没有CA证书,那么浏览器就会告警提示你要不要打开了。

当SSL证书不受信任的时候,并不一定就是有SSL劫持发生,有种例外情况是:一些个人网站买不起合法的SSL证书,因此会自己制作一个SSL证书来加密传输的数据。如果你经常访问某个个人网站,而且你知道这个网站是干什么的,那么这种情况可以不用担心。但是如果你访问的是网银,在线支付,或者是hotmail.com,gmail.com等,这类公司性质的网站一定会申请合法的SSL证书(12306.cn除外),一旦SSL证书不受信任,应该果断的终止访问,这个时候网络中一定会存在异常行为,对于一些小区宽带的用户一定要注意这点。

由于12306没有问CA购买证书,因此当访问12306.cn的时候,它提供的证书没法通过CA证书进行签名的认证,于是浏览器就知道这个证书不是CA认证的。所以就会告警。一个解决方法就是去12306那把它自己的CA证书下载下来。然后浏览器一看12306给的证书,说是要用12306_CA来认证,这个12306_CA就是我们刚刚下载下来的。然后把这个12306_CA中的公钥去解密浏览器拿到的证书,查看这个是不是由12306签名的,如果是那么就OK了。

那自己搭建一个CA并签名需要做些什么事情呢?具体是:
1.搭建一个CA服务器,用于客户端从它那下载CA的证书CA_CERT(这个证书客户端下载后就安装在电脑里)。这个CA证书是CA自己生成的,包含了CA的公钥(私钥当然还是藏着的啦)
2.有个人想做个网站,于是去问这个CA要注册一个认证。他自己先通过openssl命令生成一个公私钥,然后把公钥发送给CA服务器,CA服务器生成证书给了这个人,这个证书文件会的用CA的私钥签名,然后该证书XX_CERT会交给这个人
3.别人去访问这个网站的时候,会下载到XX_CERT,如果他没有安装CA_CERT,那么浏览器就会告警,说无法认证XX_CERT的签名。如果安装了CA_CERT,那么由于XX_CERT说明了它是由CA_CERT认证的,那么就会的用本机安装的CA_CERT的公钥去解密XX_CERT中的签名,看看能否正确还原,如果能正确还原,就知道了这个XX_CERT确实是由CA认证颁布的。所以就相信了这个XX_CERT,以后的通信就用XX_CERT中的公钥去进行。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*