上次我們講到如何生成密鑰對,以及如何將諸如公鑰,私鑰,證書等這一類安全對象在文件系統和內存之間來回轉換.這些是準備開CA的基本功,今天我們講一下CA的基本原理以及如何使用主體名稱結構DN(Distinguish Name)來表示每一個證書中的主體.
一份證書就是一個權威機構對一個主體的身份的確認的證明.即一份證書表示一個權威機構確認了一個主體就是它自己,而不是其它的冒名頂替者.主體可以是一個
個人,也可以不是,例如,在需要安全服務的時候,需要為一臺網站的服務器頒發證書,這種證書的主體就是一臺服務器.簽署證書的權威機構就叫做CA,該權威
機構本身也是一個主體.權威機構通過對包含有待認證的主體的一系列信息的待簽名證書"(TBS,to be
signed)進行數字簽名來表示該機構對它的認可.一份包含了待認證的主體的相關信息的TBS再加上CA使用自己的私鑰進行簽名產生的字節流放在一起,
就構成了一份標準的X509證書.
一個TBS中包含了以下這些主要信息:
證書的版本,通常是3(X509v3)
證書的序列號,RFC3280中規定,每個CA必須確保它頒發的每一份證書的序列號都是唯一的,并且序列號只能使用非負整數.
簽發者(CA)的主體名稱,一個DN對象.
證書的有效期,表示方法是兩個時間值,表示了該證書從何時開始生效,何時開始作廢.
待認證的主體的主體名稱,也是一個DN對象.
待認證的主體的公鑰,任何安全應用在確認完證書的有效性后,就可以開始使用該主體的公鑰與之進行安全通信.
如果是X509v3證書,即版本號是3的話,后面還有一個證書擴展信息字段,可以在證書里面添加一些其它的信息.
下面我們來看一下表示主體的主體名稱結構:DN.這個結就構是一個屬性的集合.每個屬性有屬性名稱和屬性值.它的作用就是用來表示"我是誰",也就是說,這個證書到底是誰頒發給誰的,這個證書對應的公鑰是誰擁有的.
通常使用一個字符串來表示DN結構,這種字符串說明了這種結構中的各個屬性的類型和值:
C=CN;S=BeiJing;L=BeiJing;O=PKU;OU=ICST;CN=wolfenstein
這里C是國家和地區代碼,S和L都是地區代碼,S相當于省或者州這樣的級別,L相當于城市級別,O是組織機構名稱,OU是次級組織機構名稱,CN是主體的
通用名(common
name).在這里,C,S,L等等屬性的類型都是相對固定的,例如C一般就是用來表示國家和地區代碼,在DN結構中還可以添加一些其它類型的信息,一般
也都是以"xxx=xxx"這樣來表示的.
下面我們來說明如何在Java語言中構造出一個主體名稱對象.
BC Provider中使用X509Name對象來表示DN,構造一個X509Name的步驟大體如下:
先構造兩個vector對象,用來表示屬性名稱和屬性值:
Vector oids = new Vector();
Vector attributes = new Vector();
然后在oids這個用來表示屬性名稱的vector對象中將屬性名稱一個一個添加進去:
oids.addElement(X509Name.C);
......
oids.addElement(X509Name.CN);
X509Name對象里面有若干常量,例如上面的X509Name.C.還有X509Name.ST等等,都可以和上面舉的例子對應起來.
然后將屬性值添加到attributes對象中:
attributes.addElement("CN");
......
attributes.addElement("Wolfenstein");
最后就可以構造出一個X509Name對象:
X509Name SubjectDN = new X509Name(oids, attributes);
這樣,我們的主體名稱結構就確立起來了.
下次我們就可以講關鍵的部分了,那就是如何用Java程序完成CA最重要的功能,簽署證書.