来源:赛迪网
作者:李素科
(转载序:网上找的好文章,一篇就把我找了几天的所有东西都概括进来了,真是非常感谢作者:李素科 其实在找资料的过程当中,主要没解决的问题在于如何获得KeyStore文件中的PrivateKey,本来查jsdk 1.4 api文档就可以知道了,但是居然从上到下看了2遍,没有发现这个方法:load() .......)
证书(Certificate,也称public-key certificate)是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的、可以用来当成信任关系中介的数字凭证。证书发行机构通过发行证书告知证书使用者或实体其公钥(public-key)以及其它一些辅助信息。证书在电子商务安全交易中有着广泛的应用,证书发行机构也称CA(Certificate Authority)。
证书在公钥加密应用中的作用是保证公钥在某些可信的机构发布,其在协议SSL、电子交易协议SET等方面有重要的应用。图1显示了一个最简单的证书应用方法:
证书的应用步骤是:
(1) A把自己的公钥PKA送到CA(Certificate Authority);
(2) CA用自己的私钥和A的公钥生成A的证书,证书内包括CA的数字签名。签名对象包括需要在证书中说明的内容,比如A的公钥、时间戳、序列号等,为了简化这里不妨假设证书中只有三项内容:A的公钥PKA、时间戳TIME1、序列号IDA。那么CA发送给A的简单证书凭证可表达为:CertA=Eca[TIME1,IDA,PKA];
(3) B同样把自己的公钥PKB送到CA;
(4) B得到CA发布的证书CertB;
(5) A告知B证书CertA;
(6) B告知A证书CertB。
A、B各自得到对方证书后,利用从CA得到的公钥(在CA的自签证书中)验证彼此对方的证书是否有效,如果有效,那么就得到了彼此的公钥。利用对方的公钥,可以加密数据,也可以用来验证对方的数字签名。
本文为了方便说明,并没有使用从CA获得的证书,而是通信双方各自产生自签证书,也就是说图1的A和B并没有经过CA,不过前提是A和B之间是互相拥有对方的证书。
证书的内容和意义如表1所示(这里以通用X .509证书格式为例)。
证书内容 | 意义 |
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 得到一个属于个人的证书。这里可以利用J2SDK的安全工具keytool手工产生自签证书,所谓自签证书是指证书中的“Subject Name”和“Issuer Name”相同的证书。