数字证书简介

来源:互联网 发布:广东省干部网络学校 编辑:程序博客网 时间:2024/05/16 07:38
文章参照自:http://www.blogjava.net/Martin-Liu-Hai-Shi/articles/232849.html
一、前言
证书(Certificate,也称public-key certificate)是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的、可以用来当成信任关系中介的数字凭证。证书发行机构通过发行证书告知证书使用者其公钥(public-key)以及其它一些辅助信息。证书在电子商务安全交易中有着广泛的应用,证书发行机构也称CA(Certificate Authority)。 
如果你对数字签名还不熟悉,请先阅读《数字签名简介》,《Java的数字签名和数字证书》
证书的内容和意义如表1所示(这里以通用X .509证书格式为例)。 
表1 证书内容和意义
证书内容意义Version告诉这个X.509证书是哪个版本的,目前有v1、V2、v3Serial Number由证书分发机构设置证书的序列号Signature Algorithm Identifier证书采用什么样的签名算法Issuer Name证书发行者名,也就是给这个证书签名的机构名Validity Period证书有效时间范围Subject Name被证书发行机构签名后的公钥拥有者或实体的名字,采用X.500协议,在Internet上的标志是惟一的。例如:CN=Java,OU=Infosec,O=Infosec Lab,C=CN表示一个subject name。
对证书的详细定义及其应用相关的各种协议,这里不加详细说明,详细细节请查看RFC2450、RFC2510、RFC2511、RFC2527、RFC2528、RFC2559、RFC2560、RFC2585、RFC2587等文档。
二、生成自签证书
        个人或机构可以从信任的证书分发机构申请得到证书,比如说,可以从http://ca.pku.edu.cn 得到一个属于个人的证书。这里是利用JDK的安全工具keytool手动工产生自签证书,所谓自签证书是指证书中的“Subject Name”和“Issuer Name”相同的证书。
获得自签证书可以分为2个步骤:
第一步:产生keystore。
输入以下命令:
keytool -genkey -alias robin -keystore robin.keystore -storepass GL2009 -keypass gl2009 -validity 100 -keyalg RSA -keysize 1024 -sigalg MD5withRSA
关于此的详细内容请参考《Jar文件的数字签名
然后按照提示输入一些信息,如下:
What is your first and last name?
  [Unknown]:  hubing
What is the name of your organizational unit?
  [Unknown]:  GL
What is the name of your organization?
  [Unknown]:  gameloft
What is the name of your City or Locality?
  [Unknown]:  chengdu
What is the name of your State or Province?
  [Unknown]:  shichuan
What is the two-letter country code for this unit?
  [Unknown]:  cn
Is CN=hubing, OU=GL, O=gameloft, L=chengdu, ST=shichuan, C=cn correct?
  [no]:  yes
第二步,把keystor导成自签证书。
输入以下命令:
keytool -exportcert -alias robin  -file robin.crt -keystore robin.keystore -storepass GL2009
这个命令用于把别名为robin是keystore文件robin.keystore导成证书文件robin.crt,其中是keystore文件robin.keystore的密码。
执行该命令就可以在当前目录下生产证书文件robin.crt.
三、读取数字证书文件
我们可以在java代码中通过javax.security.certificate包提供的API进行证书信息的读取。关于此的详细内容,请参阅《读取数字证书
四、使用数字证书
数字证书文件中包含使用者其公钥(public-key),但是其对应的私钥仍然保持在keyStore文件中。因此证书的使用者仍然需要从keyStore文件中读取私钥,以便进行签名。另外数字证书文件所含信息其实只是keyStore文件所含信息的一个子集合,通过KeyStore类的getCertificate(String alias)方法可以返回一个Certificate对象。Certificate是虚类,因此一般返回的是其子类X509Certificate的实例化对象
关于签名中使用数字证书的详细内容,请参照《签名和加密中使用数字证书