根据非对称密码学的原理,每个证书持有人都有一对公钥和私钥,这两把密钥可以互为加解
密。公钥是公开的,不需要保密,而私钥是由证书持人自己持有,并且必须妥善保管和注意
保密。
数字证书则是由证书认证机构
(
CA
)
对证书申请者真实身份验证之后,
用
CA
的根证书
对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形
成的一个数字文件。
CA
完成签发证书后,会将证书发布在
CA
的证书库(目录服务器)中,任何人都可以查询和
下载,因此数字证书和公钥一样是公开的。
可以这样说,
数字证书就是经过
CA
认证过的公钥,
而私钥一般情况都是由证书持有者在自己
本地生成的,由证书持有者自己负责保管。
具体使用时,签名操作是发送方用私钥进行签名,接受方用发送方证书来验证签名;加密操
作则是用接受方的证书进行加密,
接受方用自己的私钥进行解密。
因此,
如果说数字证书是
电子商务应用者的网上数字身份证话,那么证书相应的私钥则可以说是用户的私章或公章
SSL
由两个共同工作的协议组成:
"SSL
记录协议
"
(
SSL Record Protocol
)和
"SSL
握手协
议
"
(
SSL Handshake Protocol
)
。
SSL
记录协议建立在可靠的传输协议(如
TCP
)之上,为
高层协议提供数据封装、压缩、加密等基本功能的支持;
SSL
握手协议建立在
SSL
记录协议
之上,用于在实际的数据传输开始前,通信双方进行身份认证、协商加密算法、交换加密密
钥等。
SSL
握手协议包含两个阶段,第一个阶段用于建立私密性通信信道,第二个阶段用于客户认
证。第一阶段是通信的初始化阶段,在此阶段,首先
SSL
要求服务器向浏览器出示证书;然
后浏览器中的
SSL
软件发给服务器一个随机产生的传输密钥,
此密钥由已验证过的公钥加密,
随机产生的传输密钥是核心机密,只有客户的浏览器和此公司的
Web
服务器知道这个数字序
列。第二阶段的主要任务是对客户进行认证,此时服务器已经被认证了。服务器方向客户发
出认证请求消息。客户收到服务器方的认证请求消息后,发出自己的证书,并且监听对方回
送的认证结果。而当服务器收到客户的证书后,给客户回送认证成功消息,否则返回错误消
息。到此为止,握手协议全部结束。
要使用
SSL
协议,服务器至少有一个私有密匙和一个用于验证身份的证书。私有密匙在密匙
交换算法中用到,证书将发送到客户端,以通知服务器端的身份。如果
SSL
服务器要验证客
户端的身份,那么客户端必须也有自己的密匙库(包含私有密匙和证书)
。
JSSE
中引入了信
任库(
truststore
)的概念,它是用来保存证书的数据库。客户端或者服务器通过信任库来
验证对方的身份。
在使用
SSL
前,必须确保系统安装了
JSSE
。
JDK1.4
版本默认以及安装了
JSSE
。如果没有安
装,把下载安装好的
jar
文件拷贝到
%JAVA_HOME%\
jre\lib\ext
目录下。这样,就安装好了
JSSE
的运行环境。
下面我们使用
JDK
自带的工具创建密匙库和信任库。
1
)通过使用一下的命令来创建服务器端的密匙库。
keytool -genkey -alias hellking -keystore server.keystore -keyalg RSA
输入
keystore
密码:
changeit
您的名字与姓氏是什么?
[Unknown]
:
hellking-Server
您的组织单位名称是什么?
[Unknown]
:
huayuan
您的组织名称是什么?
[Unknown]
:
huayuan
您所在的城市或区域名称是什么?
[Unknown]
:
beijing
您所在的州或省份名称是什么?
[Unknown]
:
beijing
该单位的两字母国家代码是什么
[Unknown]
:
cn
CN=chen ya qiang, OU=huayuan, O=huayuan, L=beijing, ST=beijing, C=cn
正确吗?
[
否
]
:
y
输入
<hellking>
的主密码
(如果和
keystore
密码相同,按回车)
:
以上命令执行完成后,将获得一个名为
server.keystore
的密匙库。
2)
生成客户端的信任库。首先输出
RSA
证书:
keytool -export -file test_axis.cer -storepass changeit -keystore server.keystore
然后把
RSA
证书输入到一个新的信任库文件中。这个信任库被客户端使用,被用来验证服务
器端的身份。
keytool
-import
-file
test_axis.cer
-storepass
changeit
-keystore
client.truststore
-alias serverkey -noprompt
3
)创建客户端密匙库。重复步骤
1
,创建客户端的密匙库。也可以使用以下命令来完成:
keytool -genkey -dname " CN=hellking-Client, OU=tsinghua, O=tsinghua, L=BEIJING,
S=BEIJING, C=CN"
-storepass changeit -keystore client.keystore -keyalg RSA -keypass changeit
4
)生成服务器端的信任库。
keytool -export -file test_axis.cer -storepass changeit -keystore client.keystore
keytool
-import
-file
test_axis.cer
-storepass
changeit
-keystore
server.truststore
-alias clientkey -noprompt
生
成
了
密
匙
库
和
信
任
库
,
我
们
把
服
务
器
端
的
密
匙
库
(
server.keystore
)
和
信
任
库
(
server.truststore
)拷贝到
Tomcat
的某个目录。
下面需要更改
Tomcat
的配置文件(
server.xml
)
,增加一下部署描述符:
例程
11
为
Tomcat
配置
SSL
协议。
<Connector port="8443"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https" secure="true"
clientAuth="true"
keystoreFile="K:\jakarta-tomcat-5.0.16\server.keystore" keystorePass="changeit"
truststoreFile="K:\jakarta-tomcat-5.0.16\server.truststore"
truststorePass="changeit"
sslProtocol="TLS" />
clientAuth
参数制定服务器是否要验证客户端证书,
如果指定为
true
,
那么客户端必须拥护
服务器端可信任的证书后服务器才能响应客户端;如果指定为
false
,那么服务器不需要验
证客户端的证书。