http://blog.csdn.net/photnman/article/details/388853
背景及部分安全知识
在高度保证应用程序安全的过程中我们不免会考虑到如下的安全需求,然后根据这些安全需求提出各种安全技术:
1. 完整性验证。即防止我们的内容在网络传输的过程中不被篡改,不失其真实性。我们可以采用消息摘要技术来保证数据的完整性。对于同一内容采用同一算法计算出来的摘要是唯一的,而且是不可逆,即不能由摘要计算出原文内容。目前较为常用的算法有:MD5, SHA
2. 机密性保持。即防止内容被别人读懂。我们采用加密技术对内容进行加密,目前有对称密钥(如DES算法)和非对称密钥(如RSA)。具体知识可以查阅相关资料J
3. 认证和访问授权。通俗的说就是对来访者提供的信息进行分析和判断,从而确定来访者的身份,然后根据身份来决定他具有什么权限。这里我们一般采用证书认证。
4. 不可抵赖的证据。
5. 审计的证据。对一些安全性十分重要的数据操作进行纪录和观察。
SSL(Secure socket Layer) 安全套接层协议主要是使用公开密钥体制和X.509数字证书技术保护信息传输的机密性和完整性,它不能保证信息的不可抵赖性,主要适用于点对点之间的信息传输,常用Web Server方式。对于电子商务应用来说,使用SSL可保证信息的真实性、完整性和保密性。但由于SSL不对应用层的消息进行数字签名,因此不能提供交易的不可否认性。
实际上,SSL是允许WEB浏览器和WEB服务通过安全连接进行通信的技术。在这种安全连接上,数据在发送前经过加密码,然后服务器接收时先解密再进行处理。浏览器和服务器在发送任何数据之前都对所有流量加密。SSL是针对下面重要的安全性考虑的:
Ø 身份验证:在第一次尝试与web服务器通过安全连接通信时,服务器将以服务器证书的形式向浏览器发送一份凭证。这个证书的目的是验证这个站点就是它所宣称的那个。在有些情况下,服务器可能要求客户端提供证明它就是它所宣称的身份的证书(即客户端身份验证)。
Ø 机密性:数据通过网络在客户端和服务端进行传送时,第三方可以查看并截获数据。SSL响应是加密,这样数据就不会被第三方解密而保持其机密性。
Ø 完整性:数据通过网络在客户端和服务端进行传送时,第三方可以查看并截获数据。SSL可以保证数据不被第三方修改。
方案的选择
鉴于以上安全要求,我们初步设想了两种方案:
1. 客户端对传输数据进行摘要计算然后数字签名再加密传输,服务端再对接受到的数据进行解密验证。考虑的算法有摘要算法有MD5,加密算法有DES,RSA
2. 采用SSL,把加密验证的任务交给协议处理,客户端和服务端的程序不作任何处理。
第一种方案由于delphi用同一算法加密出来的结果java无法解密而放弃。估计是编码的原因,但因时间问题所以不再深入研究。
第二种方案目前已经配置好。下面的详细给出有关步骤。
所需软件
1. jboss3.2.1 用途:应用服务器
2. JDK1.4.1_02 其中已经包含了JSSE的最新版本。或者下载JSSE 1.0.3_01 用途:用来产生服务端使用的密钥对(keystore)。
3. Openssl 0.9.7b 用途:用来产生CA证书、签名并生成IE可导入的PKCS#12格式私钥
软件的安装
1. jboss(略)
2. 如果是JDK1.4.1_02,则jsse已经安装好。
3. 安装jsse:把JSSE包内的lib/*.jar拷贝到JAVA_HOME/jre/lib/ext/下,并且加入到CLASSPATH中;
4. .编辑JAVA_HOME/jre/lib/security/java.security文件,主要是添加:
security.provider.1=sun.security.provider.Sunsecurity.provider.2=com.sun.net.ssl.internal.ssl.Provider
5. 5. 确定你的系统有下面文件的其中一个:
1)JAVA_HOME/jre/lib/security/jssecacerts或者
2)JAVA_HOME/jre/lib/security/cacerts
这样,你的系统已经安装好了JSSE
6. Openssl 0.9.7b安装(略)
SSL配置步骤
1. 建立自己的CA证书(假设openssl安装到了c:/openssl)
1) 在适当的地方建立自己的CA目录,例如:e:/ca
2) 我的电脑-〉右键-〉属性-〉高级-〉环境变量-〉新建->administrator用户变量-〉变量名:OPENSSL_CONF->变量值:C:/openssl/ssl/openssl.cnf
3) 生成CA密钥
openssl genrsa -out e:/ca/ca-key.pem 1024
genrsa [产生密钥命令] –out[密钥文件输出路径] 1024 [密钥位数]
4) 生成待签名的证书
openssl req -new -out e:/ca/ca-req.csr -key e:/ca/ca-key.pem
req[产生证书命令]-new[新生成]-out[证书文件输出路径]-key[私钥文件路径]
控制台显示并需要你输入:
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:gd
Locality Name (eg, city) []:sz
Organization Name (eg, company) [Internet Widgits Pty Ltd]:oaking
Organizational Unit Name (eg, section) []:its
Common Name (eg, YOUR name) []:itsCA
Email Address []:zhangchunying@oaking.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:itsca
An optional company name []:oaking
[注]:粗体为输入值。在这里我们设置生成签名证书的密码为itsca
5) 用CA私钥自签名
openssl x509 -req -in e:/ca/ca-req.csr -out e:/ca/ca-cert.pem -signkey e:/ca/ca-key.pem -days 365
x509[签发x509证书命令]-req[输入待签发证书]-in[输入待签发证书文件路径]-out[产生x509证书文件输出路径]-signkey[自签发密钥文件路径]-days[证书有效期]–CA[签发跟证书]-Cakey[根证书密钥文件] –-CAcreateserial[创建序列号]
2. 建立服务器证书
1) .建立工作目录, 在ca目录下建立自己的server目录
2) .生成server密钥对
keytool -genkey -alias itsserver -validity 365 -keyalg RSA -keysize 1024 -keystore E:/ca/server/server_keystore
-genkey[产生密钥对]-alias[密钥对别名]-validity[密钥有效期]-keyalg[密钥算法参数]-keysize[密钥位数]-keypass[密钥保护密码]-storepass[存储密码]-dname[别名相关附加信息]-keystore[密钥存储文件路径]
[注] -alias后的tomcat是密钥对的名字可替换为自己需要的名字;
-keypass与-storepass后的密码为保护密码必须6位;
其中cn是服务器的名字一定要与WEB服务器中设置的一样。
控制台显示需要我们输入的内容如下:
输入keystore密码: itskey
您的名字与姓氏是什么?
[Unknown]: 192.168.70.95
您的组织单位名称是什么?
[Unknown]: its
您的组织名称是什么?
[Unknown]: oaking
您所在的城市或区域名称是什么?
[Unknown]: sz
您所在的州或省份名称是什么?
[Unknown]: gd
该单位的两字母国家代码是什么
[Unknown]: CN
CN=192.168.70.95, OU=its, O=oaking, L=sz, ST=gd, C=CN 正确吗?
[否]: y
输入<itsserver>的主密码
(如果和 keystore 密码相同,按回车):
[注]粗体为输入部分。-alias后的itsserver是密钥对的名字可替换为自己需要的名字;-keypass与-storepass后的密码为保护密码必须6位;-keypass与-storepass后的密码为保护密码必须6位,在这里我们设为itskey,而且最好一样,;其中cn是服务器的名字一定要与WEB服务器中设置的一样。
3) .生成待签名证书
keytool -certreq -alias itsserver -sigalg MD5withRSA -file E:/ca/server/server.csr -keypass itskey -keystore e:/ca/server/server_keystore -storepass itskey
-certreq[产生待签名证书]-alias[证书别名]-sigalg[证书算法参数]-file [产生文件输出路径]-keypass[密钥保护密码]-keystore[存储文件路径]-storepass[存储密码]
[注] 这里的证书别名等于上面keystore的别名,keypass(主密码/密钥保护密码)和storepass也与上面的一致
4) 拷贝C:/openssl/apps/ca-cert.srl文件到ca目录(必须在5前,顺序不能颠倒)
5) 用CA私钥签名
openssl x509 -req -in E:/ca/server/server.csr -out E:/ca/server/server-cert.pem -CA E:/ca/ca-cert.pem -CAkey E:/ca/ca-key.pem -days 365
3. 将CA根证书和服务器证书导入服务端
1) 导入CA根证书
keytool -import -v -trustcacerts -storepass itscaroot -alias its_ca_root -file ca-cert.pem -keystore e:/ca/server/cacerts
-import[导入命令] -v–trustcacerts[导入信任证书] –storepass[存储密码]-alias[证书别名]-file[证书文件路径]-keystore[导入文件路径]-alias为CA根证书的别名。
[注]存储密码必须至少为6位。这里我们设为itscaroot
2) 拷贝cacerts文件到C:/j2sdk1.4.1_01/jre/lib/security目录
3) 导入服务器证书
keytool -import -v -trustcacerts -storepass itskey -alias itsserver -file E:/ca/server/server-cert.pem -keystore E:/ca/server/server_keystore
[注] 此时的-storepass为生成证书时输入密码。-alias为服务器证书的别名。
4) 查看证书
查看CA证书 keytool -list -keystore server/cacerts
查看服务器证书 keytool -list -keystore server/server_keystore
4. 在jboss3.2.2中配置SSL:
1) 拷贝server_keystore到jboss3.2.2/server/all/conf目录下
2) 在${JBOSS_HOME}/server/all/deploy/jbossweb-tomcat41.sar/META-INF目录下的jboss-service.xml文件去掉如下内容的注释,并更改keystorePass为我们的keystorePass,如我们这次配keystorePass为itskey:
<Connector className = "org.apache.coyote.tomcat4.CoyoteConnector"
address="${jboss.bind.address}" port = "8443" scheme = "https" secure = "true">
<Factory className= "org.apache.coyote.tomcat4.CoyoteServerSocketFactory"
keystoreFile="${jboss.server.home.dir}/conf/server_keystore"
keystorePass="itskey"
protocol = "TLS"/>
</Connector>
然后注释掉下面这段内容:
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
address="${jboss.bind.address}" port="8080" minProcessors="5" maxProcessors="100"
enableLookups="true" acceptCount="10" debug="0"
connectionTimeout="20000" useURIValidationHack="false"/>
意图在于封住8080端口,只能通过SSL访问
这样,SSL就配置好了
5. 配置IE客户端
1) 建立自己的Client目录,在ca目录下建立自己的Client目录
2) 生成Client密钥对
openssl genrsa -out E:/ca/client/client-key.pem 1024
3) 生成待签名的证书
openssl req -new -out E:/ca/client/client-req.csr -key E:/ca/client/client-key.pem
控制台显示要输入内容:
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:gd
Locality Name (eg, city) []:sz
Organization Name (eg, company) [Internet Widgits Pty Ltd]:oaking
Organizational Unit Name (eg, section) []:its
Common Name (eg, YOUR name) []:192.168.70.163
Email Address []:zhangchunying@oaking.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:itsclient
An optional company name []:oaking
[注] Common Name为客户端机器的名字
4) 用CA私钥签名
openssl x509 -req -in E:/ca/client/client-req.csr -out E:/ca/client/client-cert.pem -signkey E:/ca/client/client-key.pem -CA E:/ca/ca-cert.pem -CAkey E:/ca/ca-key.pem -CAcreateserial -days 365
5) 生成Client端可以导入的个人证书
openssl pkcs12 -export -clcerts -in E:/ca/client/client-cert.pem -inkey E:/ca/client/client-key.pem -out E:/ca/client/client.p12
pkcs12[生成PKS12格式证书命令]-export[导出文件]-clerts[仅导出client证书]-in[输入的client证书文件路径]-inkey[client证书密钥文件路径]-out[导出PKS12格式文件路径]
[注] 系统会提示你输入密码,这个密码是导入IE时提示输入的私钥保护密码,不必与3步输入的相同。我们这里输入123456
6. 在IE浏览器的”Internet选项”菜单的高级选项选择”使用SSL2.0”和”SSL3.0”。
7. 将CA证书与client证书导入IE
1) 导入CA根证书
将目录ca中的ca-cert.pem改名为ca-cert.cer;
在client端的IE中使用<工具>,< Internet选项>,<内容>,<证书>,<导入>,把我们生成的CA根证书导入,使其成为用户信任的CA。
2) 导入client证书
将client证书(client.p12)导入到client端的IE中作为client证书,导入过程同上
8. 启动jboss3.2.1
9. 在IE浏览器的地址栏中输入https://localhost:8443,如果前面的操作都正确,应该可以看到网站静态导出的页面,在这之前,IE提示你是否访问安全页面。同时状态栏上的小锁处于闭合状态,表示您已经成功地与服务器建立了要求客户端验证的SSL安全连接。
至此,我们的SSL配置已全部结束J