最近因为有个项目,对方采用APACHE+TOMCAT方式进行应用配置。之前对于APACHE+TOMCAT合作方式并不是很了解,通过GOOGLE基本了解后开始了试验环境搭建及测试。从各方面文档看主要配置手段可以分为JK和ProxyPass方式。还有一种AJP我没有找到合适的配置文档,所以没有成功。这里我只介绍前两种的配置方法。
一、环境准备
apache2.0.63(OPENSSL) + tomcat 5.0.30 可以从官方网站上下载.
jk_mod 可以从http://tomcat.apache.org/download-connectors.cgi 下载。
操作系统 winxp sp3
apache、tomcat 安装已经可以运行,数字证书已经申请。相关细节可以查看http://files.cnblogs.com/bjrmt/server_Apache.pdf http://files.cnblogs.com/bjrmt/113656.pdf
http://files.cnblogs.com/bjrmt/apache-tomcat-install.pdf 文档。
二、JK 环境配置
官方目前已经不支持JK2,所以我采用的是mod_jk-1.2.26-httpd-2.0.61.so。JK方式主要通过TOMCAT 8009端口进行通信,至于apache tomcat之间采用什么的协议是无所谓的。在tomcat SERVER.XML文件当中有如下内容:
<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />
当tomcat 启动时--
配置APACHE:在httpd.conf
添加 LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.0.61.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkRequestLogFormat "%w %V %T"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
<VirtualHost *:80>
<IfModule mod_ssl.c>
SSLEngine on
SSLSessionCacheTimeout 300
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLOptions +StdEnvVars +ExportCertData 当tomcat需要读取客户端证书内容需加上ExportCertData
SSLCertificateFile conf/ssl.crt/localhost.cer CA返回的证书文件
SSLCertificateKeyFile conf/ssl.crt/server.key 通过OPENSSL生成的私钥
SSLCertificateChainFile conf/ssl.crt/cachain.cer 服务器证书验证链文件
SSLCACertificatePath conf/ssl.crt CA根证书文件路径
SSLCACertificateFile conf/ssl.crt/cachain.cer CA根证书文件
SSLVerifyClient require 是否要求客户端证书验证 none为不要求 require 为要求
SSLVerifyDepth 3 证书检索深度,一般放在3或者4即可
</IfModule>
ServerName localhost
JkMount /*.jsp worker1
JkMount /*.do worker1
</VirtualHost>
workers.properties文件内容:该不存在需要新建
workers.tomcat_home=D:\Program Files\Apache Software Foundation\Tomcat 5.0
workers.java_home=D:\Program Files\Java\jdk1.5.0_06
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300
这样apache的配置完毕,可通过 apache -t 测试,如出现syntax OK,则配置无问题,可以启动服务器。
测试应用页面:
<%@ page import="java.security.*" %>
<%@ page import="java.security.cert.*" %>
<%@ page contentType="text/html; charset=GBK" %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY bgColor=#e4edff>
<%
boolean bRevoked=false ;
boolean isFaf = true;
X509Certificate x509Cert;
String str="";
//////////////////////////////jsp get request certificata
X509Certificate certs[] = (X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");
x509Cert = certs[0];
out.println("SerialNumber: "+x509Cert.getSerialNumber().toString(16));
out.println("<br>");
out.println("<br>");
out.println("SubjectDN: "+x509Cert.getSubjectDN().toString());
out.println("<br>");
out.println("<br>");
%>
</BODY>
</HTML>
访问https://localhost/cert.jsp 测试成功。
三、ProxyPass配置较为轻松,可直接配置。不过对于双向的认证,当这种方式时是无法读取证书内容的。至于原因我还不明白呢。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
该四项去掉注释。
<VirtualHost *:80>
<IfModule mod_ssl.c>
SSLEngine on
SSLSessionCacheTimeout 300
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLOptions +StdEnvVars +ExportCertData
SSLCertificateFile conf/ssl.crt/localhost.cer
SSLCertificateKeyFile conf/ssl.crt/server.key
SSLCertificateChainFile conf/ssl.crt/cachain.cer
SSLCACertificatePath conf/ssl.crt
SSLCACertificateFile conf/ssl.crt/cachain.cer
SSLVerifyClient require
SSLVerifyDepth 3
</IfModule>
ServerName localhost
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
</VirtualHost>