一、前言
证书(Certificate,也称public-key certificate)是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的、可以用来当成信任关系中介的数字凭证。证书发行机构通过发行证书告知证书使用者其
公钥(public-key)
以及其它一些辅助信息。证书在电子商务安全交易中有着广泛的应用,证书发行机构也称
CA
(Certificate Authority)。
如果你对数字签名还不熟悉,请先阅读《数字签名简介》,《Java的数字签名和数字证书》
证书的内容和意义如表1所示(这里以通用X .509证书格式为例)。
表1 证书内容和意义
证书内容 | 意义 |
Version | 告诉这个X.509证书是哪个版本的,目前有v1、V2、v3 |
Serial 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
的实例化对象
关于签名中使用数字证书的详细内容,请参照《
签名和加密中使用数字证书》