Let's Go!

Tomcat6配置使用SSL双向认证

上一篇 / 下一篇  2009-07-17 01:04:04 / 个人分类:JAVA学习&编程相关

 

http://www.javaeye.com/topic/120780


Tomcat6配置使用SSL双向认证

最近要做一个登录时数字证书验证的功能,在用户登录时除了效验用户名密码,还需验证其数字证书。

相关资源:IBM developerWroks中国中的tomcat4中使用SSLjavaeye中的Acegi X.509双向认证

tomcat4中使用SSL中的异同:jdk1.4中已经包含JSSE。

AcegiX.509双向认证中的异同:tomcat6配置文件多了SSLEnabled="true"属性。

1.生成CA证书。目前不使用第三方权威机构的CA来认证,自己充当CA的角色。

1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey
root/root-key.pem -days 3650
4.将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey
root/root-key.pem -out root/root.p12


2.生成server证书。

1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out server/server-req.csr -key server/server-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey
server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey
server/server-key.pem -out server/server.p12


3.生成client证书。

1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out client/client-req.csr -key client/client-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey
client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey
client/client-key.pem -out client/client.p12


4.根据root证书生成jks文件

C:\OpenSSL\apps\root>keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem
-keystore root.jks


5.配置tomcat ssl,修改conf/server.xml。tomcat6中多了SSLEnabled="true"属性。
keystorefile, truststorefile设置为你正确的相关路径

xml 代码
 
  1. <connector secure="true" scheme="https" protocol="HTTP/1.1" port="8443"      
  2. sslenabled="true" maxhttpheadersize="8192" maxthreads="150"      
  3. minsparethreads="25" maxsparethreads="75" enablelookups="false"      
  4. disableuploadtimeout="true" acceptcount="100" sslprotocol="TLS"      
  5. clientauth="true" keystorefile="d:/path/bin/x509/server.p12"      
  6. keystoretype="PKCS12" keystorepass="123456" truststorefile="d:/path/bin/x509/root.jks"    
  7. truststoretype="JKS" truststorepass="123456"/>    


6.将root.p12,client.p12分别导入到IE中去(打开IE->;Internet选项->内容->证书)。

root.p12导入至受信任的根证书颁发机构,client.p12导入至个人

7.访问你的应用http://ip:8443,如果配置正确的话会出现请求你数字证书的对话框。
8.在jsp中取得符合x.509格式的证书

java 代码
 
  1. <%      
  2.         //获得certificate chain     
  3.         X509Certificate[] ca=(X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");     
  4.       if(ca==null)     
  5.       {     
  6.         out.println("No cert info!");     
  7.       } else {     
  8.         String  serial=ca[0].getSerialNumber().toString();     
  9.         String DN=ca[0].getSubjectDN().toString();       
  10.       }     
  11.       %>  

 

http://grandboy.javaeye.com/blog/179410

用Keytool和OpenSSL生成和签发数字证书

转自: http://zhouzhk.javaeye.com/blog/136943
生成server端证书
1)生成KeyPair生成密钥对
keytool -genkey -alias tomcat_server -validity 365 -keyalg RSA -keysize 1024 -keypass 123456  -storepass 123456 -keystore server_keystore
输入common name时,要和服务器的域名保持一致。
2)生成证书签名请求
keytool -certreq -alias tomcat_server -sigalg MD5withRSA -file tomcat_server.csr -keypass 123456 -storepass 123456 -keystore server_keystore
3)用CA私钥进行签名,也可以到权威机构申请CA签名。
   openssl ca -in tomcat_server.csr -out tomcat_server.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf
  其中-notext表示不要把证书文件的明文内容输出到文件中去,否则在后面用keytool导入到keystore时会出错。
4)导入信任的CA根证书到keystore
   keytool -import -v -trustcacerts  -alias my_ca_root -file ca.crt -storepass 123456 -keystore server_keystore
5)把CA签名后的server端证书导入keystore
keytool -import -v -alias tomcat_server -file tomcat_server.crt -storepass 123456 -keystore server_keystore
6)查看server端证书
   keytool -list -v -keystore server_keystore 
可以看到tomcat_server的证书链长度是2

生成client端证书
1)生成客户端CSR
   openssl genrsa -des3 -out tomcat_client.key 1024
openssl req -new -key tomcat_client.key -out tomcat_client.csr -config openssl.cnf
2)用CA私钥进行签名,也可以到权威机构申请CA签名
openssl ca -in tomcat_client.csr -out tomcat_client.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf
3)生成PKCS12格式证书
openssl pkcs12 -export -inkey tomcat_client.key -in tomcat_client.crt -out  tomcat_client.p12
4)使用Keytool列出pkcs12证书的内容:
   keytool -rfc -list -keystore tomcat_client.p12 -storetype pkcs12

 

--------------------------------
keytool可以导出.p12后缀名的个人证书吗?

好像不行,keytool产生的证书是JKS编码的
除了keytool,还有很多方法可以完成对keystore里面证书的操作!
比如
1、用KeyTool结合pkeytool导出私钥和证书,然后用openssl将私钥和证书合并成p12格式,具体命令请参考pkeytool和openssl帮助
2、图形工具portecle,直接导出p12格式
3、KeyTool GUI 1.6,图形界面
4、keystore explorer,需要付费
etc.

--------------------------------------------

如何用Tomcat和Openssl构建HTTPS双向认证环境(HTTPS客户端认证)


文章出处:http://www.diybl.com/course/4_webprogram/jsp/jsp_js/200855/113649.html

 

--------------------------------------------

[OpenSSL示例]HTTPS中间人攻击

http://hi.baidu.com/52hack/blog/item/b27f52af5d3881f3fbed50d9.html

 

--------------------------------------------

http://www.51testing.com/?128005/action_spacelist_type_blog_page_2.html

jmeter测试https应用

2008-06-30 12:01:19

    公司需要测试一个https加密的网站,可以用Jmeter进行测试的时候,查看执行结果树的时候,总是出现重定向错误,于是上网搜索资料,查询到如下的一篇文章,根据里面的说明,修改jmeter的启动文件,居然成功了,于是转载在这里

    实验室的项目是做关于web service的security产品,主要是对soap消息进行加密签名。上一次的性能测试是将单纯调用web service和应用我们的security产品后的web service进行对比,然而差距还是相当明显的,尤其是在高并发的时候,毕竟中间的加密和签名过程是相当消耗时间的。上次review的时候,老师就说性能有很大的程度可以提高,我本来想说基本没太多的空间可以优化(除了之后会加入的线程池,应该会有小幅度性能提升),但是苦于没有数据支持。正好这两天为了准备开题,一直在看一些文章,看到网上有人提到,SSL + WS-Security = Web Service安全保障,主张用https的方式来传输soap消息。虽然不是什么很好的方法,不过不是正好拿来作为产品测试对比的对象嘛。

    tomcat上已经配置好了axis,通过http访问soap消息是没有问题了。但是还没有配置https,所以按着官方文档开始干活了。首先用keytool生成服务器段的keystore:

keytool -genkey -alias tomcat -keystore ktomcat.keystore

    注意,alias的密码要与keystore的密码一致,tomcat文档上是这么说的。接着是修改了server.xml:

<Connector
           port="8443" protocol="HTTP/1.1" minSpareThreads="5" maxSpareThreads="75"
           enableLookups="true" disableUploadTimeout="true"
           acceptCount="100"  maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="ktomcat.keystore" keystorePass="changeit"
           clientAuth="false" sslProtocol="TLS"/>

    重启tomcat之后,输入https://localhost:8443进行验证(注意是8443哦,我一开始居然傻乎乎的输入8080^_^)

    接着设置客户端的trustStore,jmeter需要它来信任tomcat服务器段的证书

keytool -export -alias tomcat -keystore ktomcat.keystore -file tomcat.crt
keytool -import -alias tomcat -file tomcat.crt -keystore tclient.keystore

    tomcat上的https配置成功之后,就开始jmeter的配置了,默认情况下用jmeter是不可以访问我们配置的https应用的,不过却可以访问像google等网站上的https应用,原因很简单,我们自己生成的证书是不被信任的。jmeter的官方网站有一个很大的陷阱,上面说只要修改jmeter.properties参数,将SSL Configuration部分内的注释去掉就可以了,如下

#---------------------------------------------------------------------------
# SSL configuration
#---------------------------------------------------------------------------

#Classname of the ssl provider to be used (to enable testing of https urls)
#And the package name where Stream Handlers can be found
#These provided defaults can be uncommented, and they will work if you are using
#Sun's JSSE implementation.

ssl.provider=com.sun.net.ssl.internal.ssl.Provider
ssl.pkgs=com.sun.net.ssl.internal.www.protocol

#The location of the truststore (trusted certificates) and keystore ( if other than the default.
#you can uncomment this and change the path to the correct location.
javax.net.ssl.trustStore=/home/flyerhzm/software/jakarta-jmeter-2.2/tclient.keystore
javax.net.ssl.keyStore=/home/flyerhzm/software/jakarta-jmeter-2.2/kclient.keystore

#The password to your keystore
javax.net.ssl.keyStorePassword=changeit

    不过结果还是失败,尝试了好多次,总是报SSLHandshakeException。如果是通过浏览器访问的话,浏览器都会提醒你对方的证书不合法,是否要信任它,但是java是不会询问你,而是直接抛出异常。但是如果设置了trustStore的话,就会信任对方的证书啦,太奇怪了。

    google了一下有关SSLHandshakeException,网上有说可以用-D方式添加应用参数,于是打开了jmter启动文件,修改最后一句话为:

java $JVM_ARGS $ARGS -jar `dirname $0`/ApacheJMeter.jar-Djavax.net.ssl.trustStore=/home/flyerhzm/software/jakarta-jmeter-2.2/tclient.keystore -Djavx.net.ssl.trustStorePassword=changeit"$@"

    居然成功了,呵呵。可恶,配置文件jmeter.properties居然不起作用,害我辛苦到现在。

    趁热打铁,测试了一下通过https访问web service,果然比应用我们的security产品要多消耗1倍多的时间,赞,终于有数据可以说服老师了,哈哈。

 


TAG:

测试天堂 引用 删除 ljonathan   /   2009-07-17 01:17:25
1)  进入到证书的目录:
  E:\java\jdk16\jre\lib\security

2)  在其下执行命令:
keytool -genkey -alias tomcat -keystore ktomcat.keystore

keytool -export -alias tomcat -keystore ktomcat.keystore -file tomcat.crt

keytool -import -alias tomcat -file tomcat.crt -keystore tclient.keystore

3)  修改server.xml

<Connector
           port="8443" protocol="HTTP/1.1" minSpareThreads="5" maxSpareThreads="75"
           enableLookups="true" disableUploadTimeout="true"
           acceptCount="100"  maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="E:\java\jdk16\jre\lib\security\ktomcat.keystore" keystorePass="changeit"
           clientAuth="false" sslProtocol="TLS"/>


4) 修改 system.properties

#---------------------------------------------------------------------------
# SSL configuration
#---------------------------------------------------------------------------

#Classname of the ssl provider to be used (to enable testing of https urls)
#And the package name where Stream Handlers can be found
#These provided defaults can be uncommented, and they will work if you are using
#Sun's JSSE implementation.

ssl.provider=com.sun.net.ssl.internal.ssl.Provider
ssl.pkgs=com.sun.net.ssl.internal.www.protocol

#The location of the truststore (trusted certificates) and keystore ( if other than the default.
#you can uncomment this and change the path to the correct location.
javax.net.ssl.trustStore=/home/flyerhzm/software/jakarta-jmeter-2.2/tclient.keystore
javax.net.ssl.keyStore=/home/flyerhzm/software/jakarta-jmeter-2.2/kclient.keystore

#The password to your keystore
javax.net.ssl.keyStorePassword=changeit
 

评分:0

我来说两句

Open Toolbar