配置使用SSL双向认证
HTTPS (全称: HypertextTransfer Protoco l over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。它是一个URI scheme,句法类同http:体系。它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个协议的最初研发由Netscape进行,提供了身份验证与加密通讯方法,现在它被广泛用于互联网上安全敏感的通讯,例如交易支付方面。
SSL (Secure Socket Layer)为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
OpenSSL是一套开放源代码的SSL套件,其函数库是以C语言所写成,实际作了基本的传输层的资料加密功能。OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
服务器证书(server certificates) 组成Web服务器的SSL安全功能的唯一的数字标识。通过相互信任的第三方组织获得,并为用户提供验证Web站点身份的手段。服务器证书包含详细的身份验证信息,如服务器内容附属的组织、颁发证书的组织以及称为公开密钥的唯一的身份验证文件。这意味着服务器证书确保用户关于web服务器内容的验证,同时意味着建立安全的HTTP连接是安全的。
客户端证书主要被用来进行身份验证和电子签名。安全的客户端证书我被存储于专用的usbkey中。存储于key中的证书不能被导出或复制,且 key使用时需要输入key的保护密码。使用该证书需要物理上获得其存储介质usbkey,且需要知道key的保护密码,这也被称为双因子认证。这种认证手段是目前在Internet最安全的身份认证手段之一。key的形式有多种,指纹、口令卡等。
单向认证(One-way authentication)是指仅验证一个通信会话的一个末端。例如,单向认证遵循以下顺序:1.信息 (A->B)来确立A的身份,信息是来自A,这条信息是送给B的;最后信息的完整性和原创性被确认。
双向认证(Two-way authentication)具有交互性的认证方式又称为双向认证方式。所谓对称性,则是指参与认证的实体都使用相同的机制或方法对对方的身份进行认证。例如:访问一个服务器,服务器提供一个服务器证书来标识自己是经过认证合法的,这是服务器单方向的认证,并且要求客户端提供一个个人的证书来表明自己的身份,这是客户端方向的认证,这样共同组成一个双向的认证。
银行网站有一个证书,这个证书是银行通过一家权威CA机构来认证许可的,一般从地址栏右侧可以看到证书链,3个或者2个。客户证书是由银行的自己的一套CA系统来颁发的。一般一套系统十几万。你去建行,建行给你一个他们颁发的。去工行,工行给你一套自己颁发的。都不一样。这也是最重要的区别。CA系统用来颁发、管理、吊销等一系列的动作,好对银行客户的证书进行管理。那么银行网站的证书怎么来识别你客户端的证书呢?原因在于他们在服务器上配置了一个信任文件(truststorefile),该文件中至少包含一个给你颁发证书的根证书(银行自己的根证书),这样在进入的时候就可以验证你这个证书是本银行颁发的,然后再由CA系统来判断该证书是否还在有效期内等等信息。
mkdir e:\ca
openSSL>genrsa -out e:\ca\root-key.pem1024
openSSL>req -new -out e:\ca\root-req.csr-key e:\ca\root-key.pem –config D:\openssl-0.9.8k_WIN32\openssl.cnf
openSSL>x509 -req -in e:\ca\root-req.csr-out e:\ca\root-cert.pem –signkey e:\ca\root-key.pem -days 3650
openSSL>pkcs12 -export -clcerts -in e:\ca\root-cert.pem-inkey e:\ca\root-key.pem -out e:\ca\root.p12
mkdir e:\server
进入Java_JRE\bin目录,如 cdC:\PROGRA~1\Java\jre1.5.0_06\bin,运行如下命令:
>keytool -genkey -alias server -keysize 1024 -keystore e:\server\server.jks -storepass 123456789
输入相关的内容。
注:CN为申请验证的域名。
>keytool -certreq -alias server -filee:\server\server-req.csr -keystore e:\server\server.jks -storepass 123456789
openSSL>x509 -req -in e:\server\server-req.csr -out e:\server\server-cert.pem-CA e:\ca\root-cert.pem -CAkey e:\ca\root-key.pem -days 365
mkdir e:\client
openSSL>genrsa -oute:\client\client-key.pem 1024
openSSL>req -new -out e:\client\client-req.csr-key e:\client\client-key.pem
openSSL>x509 -req -ine:\client\client-req.csr -out e:\client\client-cert.pem –signkeye:\client\client-key.pem -CA e:\ca\root-cert.pem -CAkey e:\ca\root-key.pem-CAcreateserial -days 3650
注:这里面使用的是同一个root证书进行签署,实际不同也是可以。
openSSL>pkcs12 -export -clcerts -ine:\client\client-cert.pem -inkey e:\client\client-key.pem -out e:\client\client.p12
注:P12是ie浏览器所能识别的格式,里面包含了证书链。
前面所讲都是基于OPENSSL来进行测试验证的,如果需要到一些正式证书网站申请证书的话,需要对tomcat做如下配置。
进入Java_JRE\bin目录,如 cd C:\PROGRA~1\Java\jre1.5.0_06\bin,运行如下命令:
keytool –genkey–alias server –keyalg RSA –storePass123456789 –keystore e:\server\server.jks
输入keystore密码,务必牢记此密码,后面在server.xml的配置中需要使用到。
输入相关信息。
核对信息,如果确认无误后请直接输入Y并回车
输入:keytool –certreq –alias server –storePass123456789 –keystore e:\server\server.jks –file d:\server\server-req.csr
把生成的csr文件提交到网站,随后,网站会返回一个cer格式的证书文件,这个就是服务器证书。保存为server.cer(和.pem实际上一样)
步骤和服务器的一致。
把生成的csr文件提交到网站,随后,网站会返回一个cer格式的证书文件,这个就是服务器证书。保存为client.cer
注:服务器和客户端认证的网站可以不为同一个。就是说,根证书可以不相同。
root-cert.pem //服务器的根证书,格式也可以是(.cer)
root.p12 //服务器的根证书,ie识别的格式
server-cert.pem //签署过的服务器证书,格式也可以是(.cer)
client-root-cert.pem //客户端的根证书,格式也可以是(.cer)
client.p12 //客户端的个人证书,ie识别的证书链
Ø 先导入服务器根证书(root-cert.pem)
>keytool -import -v -trustcacerts-storepass 123456789 -alias root -file e:\ca\root-cert.pem -keystore e:\server\server.jks
-----storepass证书库的密码
-----alias 存入到证书库中的别名
-----file 根证书的位置
-----keystore 证书库的位置
Ø 再导入服务器证书(server-cert.pem)
>keytool–import –v –alias server –trustcacerts –file e:\server\server-cert.pem –keystoree:\server\server.jks
注:1.顺序不能错。
2.导入的server.jks中要包含私钥。参看2.1.2
Ø 先把客户端根证书导入到信任证书库中(client-root-cert)
>keytool -import -v -trustcacerts-storepass 123456789 -alias client -file e:\client\client-root-cert.pem -keystore e:\client\client-root.jks
Ø 再把client.p12导入到ie个人证书区域
Ø 再把root.p12导入到ie受信任的根证书区域
找到conf/server.xml
找到以下内容注释掉并修改
maxThreads="150" minSpareThreads="25"maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" debug="0" scheme="https"secure="true" clientAuth="true"sslProtocol="TLS" keystoreFile="e:\server\server.jks " keystorePass="123456789" keystoreType=”JKS” truststoreFile="e:\client\client-root.jks" truststorePass="123456789"keystoreType=”JKS” /> 启动tomcat.,访问https://localhost:8443 注:------truststorefile指向的是client的root存放的证书库。 ------keystorefile指向的是server的证书库,里面包含2个证书。 root.cer //网站提供的根证书 server.cer //签署的服务器的证书 client.cer //客户端的证书 注:这里面客户端和服务器端的根证书是同一个 Ø 先导入服务器根证书(root.cer) >keytool -import -v -trustcacerts-storepass 123456789 -alias root -file e:\root.cer -keystore e:\server\server.jks -----storepass证书库的密码 -----alias 存入到证书库中的别名 -----file 根证书的位置 -----keystore 证书库的位置 Ø 再导入服务器证书(server.cer) >keytool–import –v –alias server –trustcacerts –file e:\server.cer –keystoree:\server\server.jks 注:1.顺序不能错。 2.导入的server.jks中要包含私钥。参看2.2.1 Ø 先把客户端根证书导入到证书库(root.cer) >keytool -import -v -trustcacerts-storepass 123456789 -alias root -file e:\root.cer -keystore e:\client-root.jks Ø 打开ie,把root.cer导入到受信任的根证书区域里 Ø 打开ie,把client.cer导入到个人证书区域里 用文本编辑器打开 "$JAKARTA_HOME/conf/server.xml" 找到去除注释并更新以下内容: <-- Define a SSL Coyote HTTP/1.1Connector on port 8443 -->
3.2 CA配置
3.2.1 所需证书
3.2.2 服务器证书导入
3.2.3 客户端证书导入
3.2.4 修改server.xml