`

数字证书、公钥和私钥这三者之间的关系

阅读更多

      根据非对称密码学的原理,每个证书持有人都有一对公钥和私钥,这两把密钥可以互为加解密。公钥是公开的,不需要保密,而私钥是由证书持人自己持有,并且必须妥善保管和注意保密。数字证书则是由证书认证机构(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,那么服务器不需要验证客户端的证书。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics