上次我们讲到如何生成密钥对,以及如何将诸如公钥,私钥,证书等这一类安全对象在文件系统和内存之间来回转换.这些是准备开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最重要的功能,签署证书.