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證書作廢表,或證書黑名單表)中。這也是序列號唯一的原因。
5、證書的有效期:證書起始日期和時間以及終止日期和時間;指明證書在這兩個時間內有效。
6、認證機構:證書發布者,是簽發該證書的實體唯一的CA的X.500名字。使用該證書意味着信任簽發證書的實體。(注意:在某些情況下,比如根或頂級CA證書,發布者自己簽發證書)
7、發布者的數字簽名:這是使用發布者私鑰生成的簽名,以確保這個證書在發放之后沒有被撰改過。
8、簽名算法標識符:用來指定CA簽署證書時所使用的簽名算法。算法標識符用來指定CA簽發證書時所使用的公開密鑰算法和HASH算法。
證書結構
擴展文件
RSA算法
RSA算法基於一個十分簡單的數論事實:將兩個大質數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
會話密鑰
當我們在進行通信的時候,常常需要在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、還是一樣,對稱密碼算法速度會更快