配置使用SSL双向认证
一.名词解释
1.1 Https
HTTPS (全称: HypertextTransfer Protoco l over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。它是一个URI scheme,句法类同http:体系。它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个协议的最初研发由Netscape进行,提供了身份验证与加密通讯方法,现在它被广泛用于互联网上安全敏感的通讯,例如交易支付方面。
1.2 SSL
SSL (Secure Socket Layer)为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
1.3 OpenSSL
OpenSSL是一套开放源代码的SSL套件,其函数库是以C语言所写成,实际作了基本的传输层的资料加密功能。OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
1.4 服务器证书
服务器证书(server certificates) 组成Web服务器的SSL安全功能的唯一的数字标识。通过相互信任的第三方组织获得,并为用户提供验证Web站点身份的手段。服务器证书包含详细的身份验证信息,如服务器内容附属的组织、颁发证书的组织以及称为公开密钥的唯一的身份验证文件。这意味着服务器证书确保用户关于web服务器内容的验证,同时意味着建立安全的HTTP连接是安全的。
1.5客户端证书
客户端证书主要被用来进行身份验证和电子签名。安全的客户端证书我被存储于专用的usbkey中。存储于key中的证书不能被导出或复制,且 key使用时需要输入key的保护密码。使用该证书需要物理上获得其存储介质usbkey,且需要知道key的保护密码,这也被称为双因子认证。这种认证手段是目前在Internet最安全的身份认证手段之一。key的形式有多种,指纹、口令卡等。
1.6单向认证
单向认证(One-way authentication)是指仅验证一个通信会话的一个末端。例如,单向认证遵循以下顺序:1.信息 (A->B)来确立A的身份,信息是来自A,这条信息是送给B的;最后信息的完整性和原创性被确认。
1.7双向认证
双向认证(Two-way authentication)具有交互性的认证方式又称为双向认证方式。所谓对称性,则是指参与认证的实体都使用相同的机制或方法对对方的身份进行认证。例如:访问一个服务器,服务器提供一个服务器证书来标识自己是经过认证合法的,这是服务器单方向的认证,并且要求客户端提供一个个人的证书来表明自己的身份,这是客户端方向的认证,这样共同组成一个双向的认证。
1.8银行的双向认证原理
银行网站有一个证书,这个证书是银行通过一家权威CA机构来认证许可的,一般从地址栏右侧可以看到证书链,3个或者2个。客户证书是由银行的自己的一套CA系统来颁发的。一般一套系统十几万。你去建行,建行给你一个他们颁发的。去工行,工行给你一套自己颁发的。都不一样。这也是最重要的区别。CA系统用来颁发、管理、吊销等一系列的动作,好对银行客户的证书进行管理。那么银行网站的证书怎么来识别你客户端的证书呢?原因在于他们在服务器上配置了一个信任文件(truststorefile),该文件中至少包含一个给你颁发证书的根证书(银行自己的根证书),这样在进入的时候就可以验证你这个证书是本银行颁发的,然后再由CA系统来判断该证书是否还在有效期内等等信息。
2.创建证书
二. 利用openSSL创建证书
2.1.1创建根证书(root)
Ø 建立目录
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
Ø 导出P12格式证书
openSSL>pkcs12 -export -clcerts -in e:\ca\root-cert.pem-inkey e:\ca\root-key.pem -out e:\ca\root.p12
2.1.2创建服务器证书(server)
Ø 建立目录
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
2.1.3创建客户端证书(client)
Ø 建立目录
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证书进行签署,实际不同也是可以。
Ø 导出P12格式证书
openSSL>pkcs12 -export -clcerts -ine:\client\client-cert.pem -inkey e:\client\client-key.pem -out e:\client\client.p12
注:P12是ie浏览器所能识别的格式,里面包含了证书链。
2.2利用CA创建证书
前面所讲都是基于OPENSSL来进行测试验证的,如果需要到一些正式证书网站申请证书的话,需要对tomcat做如下配置。
2.2.1生成证书请求文件(服务器.CSR)
进入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
2.2.2获得证书(cer)
把生成的csr文件提交到网站,随后,网站会返回一个cer格式的证书文件,这个就是服务器证书。保存为server.cer(和.pem实际上一样)
2.2.3生成证书请求文件(客户.csr)
步骤和服务器的一致。
2.2.4获得证书
把生成的csr文件提交到网站,随后,网站会返回一个cer格式的证书文件,这个就是服务器证书。保存为client.cer
注:服务器和客户端认证的网站可以不为同一个。就是说,根证书可以不相同。
三.配置Tomcat
3.1OPENSSL配置
3.1.1 所需证书
root-cert.pem //服务器的根证书,格式也可以是(.cer)
root.p12 //服务器的根证书,ie识别的格式
server-cert.pem //签署过的服务器证书,格式也可以是(.cer)
client-root-cert.pem //客户端的根证书,格式也可以是(.cer)
client.p12 //客户端的个人证书,ie识别的证书链
3.1.2 服务器证书导入
Ø 先导入服务器根证书(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
3.1.3 客户端证书导入
Ø 先把客户端根证书导入到信任证书库中(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受信任的根证书区域
3.1.4 修改server.xml
找到conf/server.xml
找到以下内容注释掉并修改
<!-- Define an SSL HTTP/1.1 Connector onport 8443 -->
<Connector port="8443"
maxThreads="150" minSpareThreads="25"maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https"secure="true"
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个证书。
3.2 CA配置
3.2.1 所需证书
root.cer //网站提供的根证书
server.cer //签署的服务器的证书
client.cer //客户端的证书
注:这里面客户端和服务器端的根证书是同一个
3.2.2 服务器证书导入
Ø 先导入服务器根证书(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
3.2.3 客户端证书导入
Ø 先把客户端根证书导入到证书库(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导入到个人证书区域里
3.2.4 修改server.xml
用文本编辑器打开 "$JAKARTA_HOME/conf/server.xml"
找到去除注释并更新以下内容:
<-- Define a SSL Coyote HTTP/1.1Connector on port 8443 -->
<!--
<ConnectorclassName="org.apache.coyote.tomcat5.CoyoteConnector"
port="8443" minProcessors="5" maxProcessors="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https"secure="true"
true" sslProtocol="TLS"
keystoreFile =”e:\server\server.jks” //server的证书库,里面存放私钥和公钥
keystorePass="123456789"
keystoreType=”JKS”
truststoreFile=”e:\client-root.jks” //client的root证书库,里面存放着client的root公钥
truststorePass=”123456789”
truststoreType=”JKS”
/>
注:在只配置服务器端的时候,完成的是单向链接认证。一些认证网站上面申请的认证,也都是完成的单向认证,没有提供双向认证。所以只能用这种信任的办法(truststore)来把客户端和服务器端进行配对。(原理参看名词解释的银行认证)
四.配置weblogic
4.1 OpenSSL配置
4.1.1 所需证书
root-cert.pem //服务器的根证书,格式也可以是(.cer)
root.p12 //服务器的根证书,ie识别的格式
server-cert.pem //签署过的服务器证书,格式也可以是(.cer)
client-root-cert.pem //客户端的根证书,格式也可以是(.cer)
client.p12 //客户端的个人证书,ie识别的证书链
4.1.2 服务器证书导入
Ø 先导入服务器根证书(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
4.1.3 客户端证书导入
Ø 先把客户端根证书导入到信任证书库中(client-root-cert)
>keytool -import -v -trustcacerts-storepass 123456789 -alias client -file e:\root.cer -keystore e:\client\client-root.jks
Ø 再把client.p12导入到ie个人证书区域
Ø 再把root.p12导入到ie受信任的根证书区域
4.1.4 配置
Ø 启动weblogic
Ø 打开IE,键入http://localhost:7001,打开控制台。
Ø 点击左面的“锁定并编辑”
Ø 选择环境----服务器
Ø 选择默认的adminserver
Ø 勾选SSL
Ø 选择上面的配置----密钥库
---密钥库:自定义标识和自定义信任
---自定义标识密钥库:服务器密钥存放的库,我们这里为e:\server\server.jks
---自定义标识密钥库类型:JKS
---自定义标识密钥库密码:密钥库的密码
---自定义信任密钥库:客户端root证书存放的库,我们这里为e:\client\client-root.jks
---自定义信任密钥库类型:jks
---自定义信任密钥库密码:密钥库密码
Ø 点击配置----SSL
---标识和信任位置:密钥库
---私钥别名:密钥库中私钥的alias,我们这里是e:\server\server.jks中私钥的别名server。
可以回看私钥设置(2.1.2)
---私钥密码:私钥的密码。我们这里和keystore的密码一致。
Ø 点击高级
在“双向客户端证书行为”中,设置为:请求客户端证书并强制使用。
Ø 完成后,点击“激活更改”
Ø 用IE打开
Ø 出现选择证书
Ø 选择client就可以进入了。
4.2 CA配置
4.2.1 所需证书
root.cer //网站提供的根证书
server.cer //签署的服务器的证书
client.cer //客户端的证书
注:这里面客户端和服务器端的根证书是同一个
4.2.2 服务器证书导入
Ø 先导入服务器根证书(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
4.2.3 客户端证书导入
Ø 先把客户端根证书导入到证书库(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导入到个人证书区域里
4.2.4 配置
大体上和OPENSSL的配置相同。
进行以下配置:
“私钥别名”:server
“自定义信任密钥库”:e:\client-root.jks