近日,随着铁路客服中心网上购票系统中逐步可以购买大部分车次的列车,12306网站的种种问题便暴露出来,估计现在信息中心及系统开发商正在紧锣密鼓关注系统运行状态,并绞尽脑汁查找一切可以优化的地方进行优化,来满足数量惊人的火车票订票需求。先撇开性能问题不谈,使用过12306的朋友可能都注意到了,在使用12306进行网上购票之前,需要下载一个根证书到本地,然后,按照相关文件的说明,将证书导入IE浏览器,才能正常执行购票等操作。这个证书其实跟SSL/TLS有密切关系。本文介绍下在ApusicAS下如何配置SSL,使AAS支持基于SSL的双向认证。
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。为了在不安全的网络上安全保密的传输关键信息,Netscape公司开发了SSL协议,后来IETF(Internet Engineering Task Force)把它标准化了,并且取名为TLS,目前TLS的版本为1.0,TLS1.0的完整版本请参考rfc2246(www.ietf.org)。基于TLS协议的通信双方的应用数据是经过加密后传输的,应用数据的加密采用了对称密钥加密方式,通信双方通过TLS握手协议来获得对称密钥。为了不让攻击者偷听、篡改或者伪造消息,通信的双方需要互相认证,来确认对方确实是他所声称的主体。TLS握手协议通过互相发送证书来认证对方,一般来说只需要单向认证,即客户端能确认服务器便可。但是对于对安全性要求很高的应用往往需要双向认证,以获得更高的安全性。下面详细讲述建立自己的认证机构,并且利用它来颁发服务器证书和客户端个人证书,然后配置服务器来使用双向认证。关于SSL与TLS的更加详细的信息,请参考相关专业资料。
Apusic应用服务器完全支持SSL协议SSL3.0和TLS1.0协议。
在进行双向安全传输之前,首先,建立自己的认证授权机构CA,用户可以向可信的第三方认证机构(CA)申请证书,也可以自己做CA,由自己来颁发证书。(本文末尾将会介绍如何使用openSSL来生成CA证书的操作步骤)
其次,生成服务器端证书。服务器端证书用来向客户端证明服务器的身份,也就是说在SSL协议握手的时候,服务器发给客户端的证书。生成服务器证书使用JDK的密钥管理工具Keytool,本文采用的jdk是Oracle jdk1.5.0。
- 建立工作目录。
cd ..
mkdir server
cd server
- 生成服务器私钥对及自签名证书,并且保存在密钥库mykeystore中。
keytool -genkey -alias myserver -keyalg RSA -keysize 1024 –keypass keypass -storepass keypass -dname "cn=localhost, ou=dev, o=apusic, l=Shenzhen, st=guangdong, c=CN" -keystore mykeystore
- 生成服务器待签名证书。
keytool -certreq -alias myserver -sigalg SHA1withRSA -file server.csr -keypass keypass -storepass keypass -keystore mykeystore
- 请求CA签名服务器待签名证书,得到经CA签名的服务器证书。
openssl x509 -req -in server.csr -out server-cert.cer -CA ..\ca\ca-cert.cer -CAkey ..\ca\dsakey -days 365 -set_serial 02
- 把CA根证书导入密钥库mykeystore。
keytool -import -alias caroot -file ..\ca\ca-cert.cer -noprompt -keypass keypass -storepass keypass -keystore mykeystore
- 把经过CA签名的服务器证书导入密钥库mykeystore。
keytool -import -alias myserver -file server-cert.cer -noprompt -keypass keypass -storepass keypass -keystore mykeystore
接下来,颁发并发布个人证书。个人证书用来向服务器证明个人的身份,也就是说在SSL协议握手的时候,客户端发给服务器端的证书。同时个人证书中包含个人信息如用户名等,如果需要,这个用户名将作为登录服务器的用户名。
- 建立工作目录。
cd .. mkdir client cd client
- 生成客户端私钥。
openssl genrsa -out clientkey 1024
- 生成客户端待签名证书。
openssl req -new -out client.csr -key clientkey
- 请求CA签名客户端待签名证书,得到经CA签名的客户端证书。
openssl x509 -req -in client.csr -out client.cer -CA ..\ca\ca-cert.cer -CAkey ..\ca\dsakey -days 365 -set_serial 02
- 生成客户端的个人证书client.p12。
openssl pkcs12 -export -clcerts -in client.cer -inkey clientkey -out client.p12
- CA根证书导入客户端。
在这里CA的根证书用来在SSL握手时验证服务器发给客户端浏览器的证书。如果没有此证书,浏览器将无法自动验证服务器证书,因此浏览器将弹出确认信息,让用户来确认是否信任服务器证书。在客户端的IE中使用"工具-> Internet选项-> 内容-> 证书-> 导入"把我们生成的CA根证书ca\ca-cert.cer导入,使其成为用户信任的CA。
客户端个人证书导入客户端: 在客户端的IE中使用"工具-> Internet选项-> 内容-> 证书-> 导入"把我们生成的CA根证书client.p12导入,使其成为用户信任的CA。
然后,配置服务器允许双向认证。
为了保证AAS的通用性,Apusic应用服务器出厂默认配置下不支持双向认证,要支持SSL双向认证,需要对配置作如下修改:
修改Muxer服务:如果采用密钥库文件的方式,示例配置如下:
<SERVICE CLASS="com.apusic.net.Muxer" >
<ATTRIBUTE NAME="Port" VALUE="6888"/>
<ATTRIBUTE NAME="Backlog" VALUE="50"/>
<ATTRIBUTE NAME="Timeout" VALUE="300"/>
<ATTRIBUTE NAME="MaxWaitingClients" VALUE="500"/>
<ATTRIBUTE NAME="WaitingClientTimeout" VALUE="5"/>
<ATTRIBUTE NAME="SSLEnabled" VALUE="True"/>
<ATTRIBUTE NAME="SecurePort" VALUE="6889"/>
<ATTRIBUTE NAME="MutualAuthPort" VALUE="6887"/>
<ATTRIBUTE NAME="NeedClientAuth" VALUE="True"/>
<ATTRIBUTE NAME="KeyStore" VALUE="config/keystore"/>
<ATTRIBUTE NAME="KeyPassword" VALUE="keypass"/>
<ATTRIBUTE NAME="TrustStore" VALUE="config/truststore"/>
<ATTRIBUTE NAME="TrustStorePassword" VALUE="keypass"/>
<ATTRIBUTE NAME="TrustStoreType" VALUE="JKS"/>
</SERVICE>
如果采用
证书文件的方式,示例配置如下:
<SERVICE CLASS="com.apusic.net.Muxer" >
<ATTRIBUTE NAME="Port" VALUE="6888"/>
<ATTRIBUTE NAME="Backlog" VALUE="50"/>
<ATTRIBUTE NAME="Timeout" VALUE="300"/>
<ATTRIBUTE NAME="MaxWaitingClients" VALUE="500"/>
<ATTRIBUTE NAME="WaitingClientTimeout" VALUE="5"/>
<ATTRIBUTE NAME="SSLEnabled" VALUE="True"/>
<ATTRIBUTE NAME="SecurePort" VALUE="6889"/>
<ATTRIBUTE NAME="MutualAuthPort" VALUE="6887"/>
<ATTRIBUTE NAME="NeedClientAuth" VALUE="True"/>
<ATTRIBUTE NAME="ServerCertificateKey" VALUE="config/192.168.6.191.key"/>
<ATTRIBUTE NAME="ServerCertificateChain" VALUE="config/192.168.6.191.cer;config/serverca.cer"/>
<ATTRIBUTE NAME="TrustCertificates" VALUE="config/clientrootca.cer"/>
</SERVICE>
最后,测试双向认证。
访问应用,如果前面的操作都正确的话,应该可以看到Apusic的欢迎页面。同时状态栏上的小锁处于闭合状态,且证书为有效状态,表示您已经成功地与服务器建立了要求客户端验证的SSL安全连接。
附:使用OpenSSL生成CA证书。
本文所使用的CA软件为Openssl。Openssl用来产生CA证书、证书签名并生成浏览器可导入的PKCS#12格式个人证书。你可以在Openssl的官方网站http://www.openssl.org下载最新版的Openssl,本文使用的是Openssl 0.9.7d。从Openssl的官方网站下载并安装了Openssl之后,设置系统环境变量Path指向Openssl的bin目录,下面开始创建CA根证书:
- 建立工作目录。
mkdir ca cd ca
- 生成ca私钥。
openssl dsaparam -out dsaparam 1024 openssl gendsa -out dsakey dsaparam
- 生成ca待签名证书。
openssl req -new -out ca-req.csr -key dsakey
- 用CA私钥进行自签名,得到自签名的CA根证书。
openssl x509 -req -in ca-req.csr -out ca-cert.cer -signkey dsakey –days