1 (Page 1 of 1)
Tomcat6配置使用SSL双向认证

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

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

异同之处
tomcat4中使用SSL中的异同:jdk1.4中已经包含JSSE。
AcegiX.509双向认证中的异同:tomcat6配置文件多了SSLEnabled="true"属性。

实现方法

  • 生成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

  • 生成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

  • 生成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

  • 根据root证书生成jks文件
C:\OpenSSL\apps\root>keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem -keystore root.jks
  • 配置tomcat使用SSL

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

  1. <CONNECTOR truststorepass="123456" truststoretype="JKS" truststorefile="d:/path/bin/x509/root.jks" 
  2. keystorepass="123456" keystoretype="PKCS12" keystorefile="d:/path/bin/x509/server.p12" clientauth="true" 
  3. sslprotocol="TLS" acceptcount="100" disableuploadtimeout="true" enablelookups="false" maxsparethreads="75" 
  4. minsparethreads="25" maxthreads="150" maxhttpheadersize="8192" sslenabled="true" port="8443" protocol="HTTP/1.1" 
  5. scheme="https" secure="true" />  
  • 将root.p12,client.p12分别导入到IE中去(IE->;Internet选项->内容->证书)

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

  • 访问你的应用http://ip:8443,如果配置正确的话会出现请求你数字证书的对话框。
  • 在jsp中取得符合x.509格式的证书
  1. <%   
  2.     //获得certificate chain   
  3.     X509Certificate[] ca = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");   
  4.     if (ca == null) {   
  5.         out.println("No cert info!");   
  6.     } else {   
  7.         String serial = ca[0].getSerialNumber().toString();   
  8.         String DN = ca[0].getSubjectDN().toString();   
  9.     }   
  10. %>  
joram使用笔记
joram是objectweb.org的java开源JMS消息中间件产品,支持JMS1.1,自带的文档和例子比较完整。中文文档比较详细的是<>这篇,文中介绍了JMS的基本概念及joram的使用方法。

下面记录我在使用过程中遇到的一些问题。 

连接远程服务器,在joram中文文档中,使用如下方法连接远程服务器
  1. Properties pr = new Properties();    
  2. // 端口,IP   
  3. pr.put("82.0.176.214","16400");    
  4. Context ictx = new InitialContext(pr);   
  5.   
  6. // 在joram 4.3.26中用这种方法死活连接不上JNDI,用下面方法能连接成功   
  7. Hashtable prop = new Hashtable();   
  8. prop.put(Context.INITIAL_CONTEXT_FACTORY,"fr.dyade.aaa.jndi2.client.NamingContextFactory");   
  9. prop.put("java.naming.factory.host", host);   
  10. prop.put("java.naming.factory.port", port);   
  11. Context jndiCtx = new InitialContext(prop);  

以编程方式启动joram服务器,而不使用命令行方式启动

  1. AgentServer.main(new String[] { "0""./s0" });    

注意:这种方式启动joram服务器,a3servers.xml文件的目录必须在classpath中。
注注意:假如你的a3servers.xml文件不在classpath中,他会读自己jar包中的a3servers.xml,自带的xml文件中没有配置jndi服务器,如果你碰到在程序中启动服务器,却连接不上jndi,看下是不是这个问题。
我就犯了个错误,将a3servers.xml的文件路径放classpath中去了,而不是这个文件的目录路径,joram找不到我的配置文件,就去读自带的配置文件。造成连接不上jndi,最后还是同事帮偶解决的。

 

使用ant操作tomcat
  • 使用ant启动和关闭tomcat,在build.xml中加入下面代码片段
使用这种方法要先设置好环境变量CATALINA_HOME=tomcat的安装路径
如果有时你不想重启整个应用,而只操作tomcat下某一个项目
  1. <property name="tomcat.home" value="you tomcat home directory here."></property>  
  2.   
  3. <TARGET name="start-tomcat" depends="stop-tomcat">  
  4.     <ECHO message="Start Tomcat" />  
  5.     <JAVA dir=/bin/ fork="true" jar="/bin/bootstrap.jar">  
  6.         <ARG value="start" />  
  7.     </JAVA>  
  8. </TARGET>  
  9.   
  10. <TARGET name="stop-tomcat">  
  11.     <ECHO message="Stop Tomcat" />  
  12.     <JAVA dir=/bin/ fork="true" jar="/bin/bootstrap.jar">  
  13.         <ARG value="stop" />  
  14.     </JAVA>  
  15. </TARGET>   
  • 使用ant操作tomcat启动/停止/重新装载(等等)某一项目

(1) 将%TOMCAT_HOME%\server\lib\catalina-ant.jar文件复制到类路径下

(2) 新建tomcatTasks.properties文件
#这些值就是catalina-ant.jar中的类文件,用来扩展ant的功能
start=org.apache.catalina.ant.StartTask
reload=org.apache.catalina.ant.ReloadTask
stop=org.apache.catalina.ant.StopTask

(3) 在build.xml中加入下面代码片段

  1. <TASKDEF file="tomcatTasks.properties">  
  2.     <CLASSPATH>  
  3.         <PATHELEMENT path="/server/lib/catalina-ant.jar" />  
  4.     </CLASSPATH>  
  5. </TASKDEF>  
  6.   
  7. <TARGET name="启动当前项目">  
  8.     <START path="/projectName" password="adminpasswd" username="admin" url="http://localhost:8080/manager" />  
  9. </TARGET>  
  10.   
  11. <TARGET name="重新装载当前项目">  
  12.     <RELOAD path="/projectName" password="adminpasswd" username="admin" url="http://localhost:8080/manager" />  
  13. </TARGET>  
  14.   
  15. <TARGET name="停止当前项目">  
  16.     <STOP path="/projectName" password="adminpasswd" username="admin" url="http://localhost:8080/manager" />  
  17. </TARGET>  

# url就是在默认首页的Tomcat Manager进去的那功能页面
# username/password就是在conf/tomcat-user.xml中配置的用户名密码,注意这个用户要有manager权限
# /projectName就是你是管理的项目的名称

配置好后,就可以使用通过ant脚本来启动,重新装载,停止某一项目了。

1 (Page 1 of 1)