X.509,RSA,PKCS 普及

X.509

X.509是一种非常通用的证书格式。所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用。

在一份证书中,必须证明公钥及其所有者的姓名是一致的。对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。X.509标准定义了证书中应该包含哪些信息,并描述了这些信息是如何编码的(即数据格式)

详细特征

所有的X.509证书包含以下数据:

1、X.509版本号:指出该证书使用了哪种版本的X.509标准,版本号会影响证书中的一些特定信息。目前的版本是3。

2、证书持有人的公钥:包括证书持有人的公钥、算法(指明密钥属于哪种密码系统)的标识符和其他相关的密钥参数。

3、证书的序列号:由CA给予每一个证书分配的唯一的数字型编号,当证书被取消时,实际上是将此证书序列号放入由CA签发的CRL(Certificate Revocation List证书作废表,或证书黑名单表)中。这也是序列号唯一的原因。

4、主题信息:证书持有人唯一的标识符(或称DN-distinguished name)这个名字在 Internet上应该是唯一的。DN由许多部分组成,看起来象这样:
CN=Bob Allen, OU=Total Network Security Division
O=Network Associates, Inc.
C=US
这些信息指出该科目的通用名、组织单位、组织和国家或者证书持有人的姓名、服务处所等信息。

5、证书的有效期:证书起始日期和时间以及终止日期和时间;指明证书在这两个时间内有效。

6认证机构:证书发布者,是签发该证书的实体唯一的CAX.500名字。使用该证书意味着信任签发证书的实体。(注意:在某些情况下,比如根或顶级CA证书,发布者自己签发证书)

7发布者的数字签名:这是使用发布者私钥生成的签名,以确保这个证书在发放之后没有被撰改过。

8签名算法标识符:用来指定CA签署证书时所使用的签名算法。算法标识符用来指定CA签发证书时所使用的公开密钥算法和HASH算法。

 

证书结构

 

X.509 v3证书数据结构如下:

 

Certificate证书

 

Version 版本

 

Serial Number序列号

 

Algorithm ID 算法标识

 

Issuer 颁发者

 

Validity 有效期

 

Not Before 有效起始日期

 

Not After 有效终止日期

 

Subject 使用者

 

Subject Public Key Info 使用者公钥信息

 

Public Key Algorithm公钥算法

 

Subject Public Key公钥

 

Issuer Unique Identifier (Optional) 颁发者唯一标识

 

Subject Unique Identifier (Optional) 使用者唯一标识

 

Extensions (Optional) 扩展

 

Certificate Signature Algorithm 证书签名算法

 

Certificate Signature 证书签名

扩展文件

.cer, .crt - 通常被用于二进制的DER文件格式(同于.der), 不过也被用于Base64编码的文件 (例如 .pem).
.P7B - 同于 .p7c
.P7C - PKCS#7证书格式,仅仅包含证书和CRL列表信息,没有私钥。
.PFX - 同于 .p12
.P12 -PKCS#12文件, 包含证书(公钥)和私钥(受密码保护),已经完整的证书链信。
PKCS#7 是一种将数据加密和签名(正式名称是“enveloping”)的技术标准。 它描述数字证书的语法和其他加密消息——尤其是,数据加密和数字签名的方法,也包含了算法。但PKCS#7不包含私钥信息。
PKCS#12 定义了一个用于保存私钥和对应公钥证书的文件格式,并由对称密钥加密保护。PKCS#12通常采用PFX,P12作为文件扩展名。 PKCS#12文件可以存放多个证书,并由密码保护,通常用于WINDOWS IIS,也能够被当作Java Keysotre文件使用,用于Tomcat,Resign,Weblogic,Jboss等,不能被用于Apache.
 

RSA算法

RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
 
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
 

会话密钥

当我们在进行通信的时候,常常需要在C/S两端分配一个会话密钥,然后利用对称密码算法对通信的数据加密,当然了,也可以使用非对称加密算法,但是非对称加密会使加密速度降低了一个数量级,因此并不适用。那么如何安全的在不安全的信道中分发会话密钥呢? 
有两种方式,一种使用共享密钥机制,这样的协议很多,比如D-H密钥分配协议、kerberos认证协议等等。但是使用共享密钥进行会话密钥的分发很麻烦,而且还有各种漏洞。作为工程人员,我们当然不希望进行复杂的多次协商才能完成认证的工作。

那么使用公开密钥机制就可以完成这个工作了。 
1、首先A获取B的公钥Eb,然后A随机选择一个随机数Ra,然后将Eb(A,Ra)发送给B。 
2、B获取到数据之后,利用自己的私钥解密出结果为A,Ra,然后B获取A的公钥Ea,然后B选择一个会话密钥Ks和一个随机数Rb并将数据Ea(Ra,Ks,Rb)发送给A。 
3、A在收到数据之后,使用自己私钥后发现有Ra,这个数据是刚刚发给B的,Ra除了B不可能有任何知道,因为只有B才能解密。所以A确定他对面肯定是B,但是这时候B并不确定对面是不是A,还是H,因为H可以宣称自己是A,所以最好的验证方法是B确定A肯定能够解密发送给A的数据。 
4、于是A 在上面收到数据之后,解密之后发现有Rb,和Ks,此时将数据Ks(Rb)发送给B。当然了,此时,B肯定知道它对面通信的是A了,于是这样就完成了相互认证,并分发共享密钥的操作。

那么为什么最后一步不是Eb(Rb),而要Ks(Rb)呢?我个人认为主要有两点:1、Eb是公开的,前者的随机性相当于只有Rb来保证,而后者Ks和Rb只有A才会知道,所以随机性更大;2、还是一样,对称密码算法速度会更快

 

 

posted @ 2017-01-06 11:43  btg.yoyo  阅读(4276)  评论(0编辑  收藏  举报