前段时间一直在做数字证书,可能是因为是第一次接触数字证书这种东西,由于概念还不是很理解,所以感觉无从下手。通过查找资料,逐步摸索,对数字证书有了初步了解。个人认为主要是对SSL概念的理解,内容其实很少,没有刚开始想象的那么复杂。
所谓证书(Certificate,也称public-key certificate)就是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的、可以用来当成信任关系中介的数字凭证。证书发行机构通过发行证书 告知证书使用者或实体其公钥(public-key)以及其它一些辅助信息。证书在电子商务安全交易中有着广泛的应用,证书发行机构也称 CA(Certificate Authority)。
证书的应用步骤是:
(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获得的证书,而是通信双方各自产生自签证书。
下面是通过最近的研究总结出来的数字证书在java中的使用:
1,生成服务器端证书
keytool -genkey -v -alias server -keyalg RSA -keystore server.keystore
2,生成客户端证书
keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12
3,将客户端证书注册到服务器端 成为受信任的(服务器端只接收.cer格式)
(1)将.p12格式转换成.cer格式
keytool -export -alias client -keystore client.p12 -storetype PKCS12 -rfc -file client.cer
(2)注册为受信任的
keytool -import -v -file client.cer -keystore server.keystore
4,在server.xml中配置:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="D:/server.keystore" keystorePass="123456"
truststoreFile="D:/server.keystore" truststorePass="123456"
/>
5,在程序中加入filter,验证数字证书的有效性