证书
证书是一个经证书授权中心签过名的包含公钥及公钥拥有者信息的文件。证书授权中心(CA)对证书签名的过程即为证书的颁发过程。证书里面的公钥只属于某一个实体(网站,个人等),它的作用是防止一个实体伪装成另外一个实体。
证书可以保证非对称加密算法的合理性,假设A和B的通话过程如下:
A -------> Hello (plain text) ---------> B
A <------- Hello (plain text) ---------- B
A <------ B Send Certificate to A --- B
A ------- cipher text ------------------> B
A <------ cipher text ------------------- B
… …
A在接受了B发过来的证书以后,A,B就可以使用密文进行通信了。
如果C想伪装成B,应该怎么做呢?我们想象下面的通话过程:
A-------> Hello (plain text) ---------> C
A <------ Hello (plain text) ----------- C
A <------ C Send Certificate to A --- C
此时A没有怀疑C的身份,理所当然的接受了C的证书,并继续进行下面的通信
A------- cipher text ------------------> C
A <------ cipher text ------------------- C
… …
这样的情况下A是没有办法发现C是假的,A的用户名,密码,甚至卡号等重要信息都有可能被C截获。如果A在通话过程中要求取得B的证书,并验证证书里面的名字,如果发现名字与B不符合,就可以发现对方不是B。验证B的名字通过后,再继续通信过程。
那么,如果证书是假的怎么办?或者证书被修改过怎么办?此时就要用到签名信息了。数字证书除了包含证书拥有者的名字和公钥外,还应包含颁发证书的机构名称,证书序列号和其它一些可选信息。最重要的是,它包含了证书颁发机构(Certification Authority,简称CA)的签名信息。
通过检查证书里面CA的签名信息,就知道这个证书的确是由该CA签发的,然后你就可以检查证书里面的证书拥有者的名字,检查通过后,就可以提取公钥,继续通信了。这样做的基础是,你信任该CA,认为该CA没有颁发错误的证书。
CA是第三方机构,被你信任,由它保证证书的确发给了应该得到证书的人。这里需要解释一下,CA也是一个实体,它也有自己的公钥和私钥,否则怎么做数字签名?它也有自己的证书,你可以去它的站点下载它的证书,来验证签名。
CA也是分级别的,最高级别的CA叫RootCA,低一级别的CA的证书由它来颁发和签名。这样我们信任RootCA,那些由RootCA签名过的证书的CA就可以来颁发证书给实体或其它CA了。那RootCA谁给签名呢?他们自己给自己签名,叫自签名。
现在常用的证书都是采用X.509格式的,这是一个国际标准的证书格式。任何遵循该标准的应用程序都可以读,写X509格式的证书。
下面是一个证书的例子:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 17209717939030827578 (0xeed53348d899a23a)
Signature Algorithm: sha1WithRSAEncryption // 签名算法
Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd // 证书颁发者信息
Validity
Not Before: Jan 14 07:01:20 2015 GMT // 证书的有效期
Not After : Feb 13 07:01:20 2015 GMT
Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd // 证书拥有者信息
Subject Public Key Info: //公钥信息
Public Key Algorithm: rsaEncryption
Public-Key: (512 bit)
Modulus:
00:c5:63:8c:c8:32:b1:2e:15:58:a6:cd:22:f4:40:
ef:53:8e:e7:fa:4e:fd:d5:d9:fe:69:a2:c2:5a:fc:
20:4b:da:c9:17:49:35:4e:67:92:82:ec:4e:a7:a7:
1a:66:3a:c5:36:2e:74:77:30:7a:dd:65:5f:03:9a:
9b:2e:d0:b1:43
Exponent: 65537 (0x10001)
X509v3 extensions: //x509扩展信息
X509v3 Subject Key Identifier:
0E:DB:FE:E6:CF:FE:A6:C8:6D:38:06:A5:22:34:DA:82:A9:BE:42:B8
X509v3 Authority Key Identifier:
keyid:0E:DB:FE:E6:CF:FE:A6:C8:6D:38:06:A5:22:34:DA:82:A9:BE:42:B8
X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha1WithRSAEncryption
32:43:0c:e8:32:6f:30:10:c9:0f:a3:36:24:7c:a5:dc:da:8c: // CA的签名
c4:90:69:90:de:b1:1b:19:8e:b1:a5:35:ce:2e:7a:05:69:94:
46:72:37:c2:2c:38:57:4a:0c:89:bc:90:95:03:af:f2:6f:a0:
3f:13:5f:f0:90:a7:2c:bf:75:ee
算法
加密算法分为两种:对称加密算法和非对称加密算法;
对称加密算法:即信息的发送方和接收方使用同一个密钥去加密和解密数据。它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。AES,DES等都是常用的对称加密算法;
非对称加密算法:它需要使用不同的密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥。信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。公钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。RSA,DSA等是常用的非对称加密算法;
所以在实际的应用中,人们通常将两者结合在一起使用