通过Proxy向Weblogic集群传递客户端证书

通过Proxy向Weblogic集群传递客户端证书

 

 

      过Weblogic集群的人都知道可以使用Proxy来分发请求和实现负载均衡,这种配置方式既灵活又十分经济,不需要额外购买昂贵的硬件负载均衡设置,十分适合中小企业采用。
在企业应用中,数据安全是非常重要的,为了保证数据的安全性,最理想也最简便的办法就是使用SSL。通过使用CA证书,服务器和客户机都能对对方的身份进行认证,在确信对方身份是可信任之后再进行业务操作,并且网络上传输的数据也是加密的,这样就能基本保证数据是安全的。一般情况下,SSL对服务器和客户机双方身份确认是由浏览器和WEB服务器来完成的,无需编程。但是,有时候应用系统也需要能取到客户证书信息,比如需要在应用中对用户证书中的用户身份信息与用户登录应用系统的帐号进行比对,以进一步确认用户身份。
对于多数的硬件负载均衡器,一般都支持透明的双向SSL,即服务器和用户证书都可以穿透负载均衡器到达对方,应用系统根本感觉不到负载均衡器的存在。但是,在使用Proxy实现的集群中,应用系统中能否正常拿到客户端证书信息呢?当然可以!
前两天接到一个客户的求援,说是他们的一个应用系统,因为不知是什么原因,硬件负载均衡器用不起来,只能用Proxy来实现负载均衡,现在需要启用SSL,但是在服务器端却取不到客户证书信息。实话说,虽然我知道在Proxy的情况下,服务器肯定有办法拿到客户证书信息的,但以前也主要在有硬件负载均衡器的情况下配置集群,还没有专门去研究Proxy与SSL的问题,惭愧啊。既然今天遇上这事儿了,那就抽点时间演练一遍。说干就干,脱下外套,操家伙上。

一、搭建环境:
 搭这个环境软件都是具备的,自己机器上装有Weblogic8.1,只需要配置几个以上Server来模拟集群环境即可。我建了两个domain,一个名为proxydomain,在其上建了一个名为proxyserver的Server,另一个domain名为bizdomain,其上建了两个Server bixserver1和bizserver2来充当集群中的业务服务器。当然,业务服务器上布署的应用可比HelloWorld复杂很多啊,呵呵(下面会详细讲啦)。

二、签发CA证书
 为了使用SSL,CA证书是不可少的。为了能得到一组互相信任的服务器证书和客户证书,我没有使用weblogic自带的demo证书来配置SSL,而是用OpenSSL新签发了一组证书,怎么用OpenSSL来签发证书超出本次课程范围,想知道的同学可以另外交钱学习啊,呵呵。签发的证书信息如下: 

 
 
服务器证书

 



 
客户证书


服务器证书可以弄一个keystore装起来,再配置到weblogic上,我嫌麻烦,就直接把证书和私钥拖到服务器上布署了(大家别学我),而客户证书和私钥需要打包成pfx格式再安装到操作系统中才可以。

三、配置proxy server
 配置proxy server很简单,只需要在proxydomain> Servers> proxy 页的General  属性页中,把“ SSL Listen Port Enabled”和“Client Cert Proxy Enabled”勾选上,“SSL Listen Port”改成443(SSL默认端口)。然后再到“Keystores & SSL”属性页上,在“SSL Configuration”下面的分别设置: 
Private Key File Name:=certs/server_key.pem
Server Certificate File Name:=certs/server.pem
Trusted CA File Name:=certs/root.cer

其中certs是CA证书保存目录,物理路径是 %weblogic安装目录%/user_projects/domains/proxydomain
在“Advanced Options-->Server Attributes”下面设置:
Two Way Client Cert Behavior:=Client Certs Requested And Enforced
含义就是强制要求客户端有证书才能连接

然后再在proxydomain/applications目录下新建一个proxy目录(你叫其他名称也可以,不会吃官司的),再在其下建一个目录WEB-INF(必须是这个名,大写),然后建两个空的XML文件:web.xml和weblogic.xml,在web.xml里填上:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "
http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">

  <display-name>weblogic代理测试</display-name>
  <description>weblogic代理测试</description>

  <servlet>
    <servlet-name>HttpClusterServlet</servlet-name>
    <servlet-class>weblogic.servlet.proxy.HttpClusterServlet</servlet-class>
    <init-param>
      <param-name>WebLogicCluster</param-name>
      <param-value>localhost:90|localhost:91</param-value>

    </init-param>
    <init-param>
      <param-name>DebugConfigInfo</param-name>
      <param-value>ON</param-value>
    </init-param>
  </servlet>
     
  <servlet-mapping>
    <servlet-name>HttpClusterServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>HttpClusterServlet</servlet-name>
    <url-pattern>*.jsp</url-pattern>
  </servlet-mapping>


  <servlet-mapping>
    <servlet-name>HttpClusterServlet</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>HttpClusterServlet</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>
 
</web-app>

在weblogic.xml里填上:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "
http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
  <charset-params>
    <input-charset>
      <resource-path>/*</resource-path>
      <java-charset-name>GBK</java-charset-name>
    </input-charset>
  </charset-params>
  <context-root>/</context-root>
</weblogic-web-app>

再把proxydomain/applications/proxy作为一个web应用布署到proxyserver上,这样,proxy服务器就配好了,启动一下,如果看到控制台有报错,那么你可以去买彩票了,小概率事件发生了。

四、配置bizserver
 在bizdomain/applications目录下新建一个目录biz,里面再建一个WEB-INF,然后照样放两个XML:web.xml和weblogic.xml。web.xml的内容是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "
http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
  <display-name>weblogic代理测试_业务服务器</display-name>
  <description>weblogic代理测试_业务服务器</description>
</web-app>

Weblogic.xml的内容是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "
http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
  <charset-params>
    <input-charset>
      <resource-path>/*</resource-path>
      <java-charset-name>GBK</java-charset-name>
    </input-charset>
  </charset-params>
  <context-root>/</context-root>
</weblogic-web-app>

然后在bizdomain/applications/biz目录下放一个非常复杂的JSP:
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.net.InetAddress" %>
<%@ page import="java.security.cert.*" %>

<%
  response.setHeader("Pragma", "No-cache");
  response.setHeader("Cache-Control", "no-cache");
  response.setDateHeader("Expires", 0);
%>
<%
String serverIP = InetAddress.getLocalHost().getHostAddress();
int serverPort = request.getServerPort();
String clientIP = request.getRemoteAddr();
try{
  java.util.Enumeration enums = request.getHeaderNames();
  java.util.ArrayList list = new java.util.ArrayList();
  while(enums.hasMoreElements()) {
    String name = (String)enums.nextElement();
    out.print(name+":");
    out.println(request.getHeader(name)+"<br>");
  }
}catch(Exception ex) {
  out.println(ex.getMessage());
  ex.printStackTrace();
}
%>
<center>
当是客户机IP是:<br>
<font color="red"><b><%=clientIP%></b></font>
<br><br>
当前连接的服务器是:<br>
<font color="red"><b><%=serverIP%>:<%=serverPort%></b></font>
<br><br>
</center>
<%
String certstr="";
X509Certificate[] certs =  (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
if(certs!=null) {
  X509Certificate mycert=(X509Certificate)certs[0];
  //out.println("Has Cert from Client!");
  certstr=mycert.toString();
} else
  out.println("could not get certificate from client!");
%>
Your Certificate(javax.servlet.request.X509Certificate) is Encode
As:
<br>
<%=certstr%>
</body>

接着再把biz作为web应用程序布署到bizserver1和bizserver2上。

五、配置Cluster
 在bizdomain的console上,在 bizdomain> Clusters 页点“Configure a new Cluster...”建一个集群,其中:
General 下:
Name = MyCluster
Cluster Address:=localhost:90,localhost:91
Default Load Algorithm:=round-robin

然后在“Servers”页把bizserver1和bizserver2选择到MyCLuster。
这样,集群也配完了。把刚才配置的这些机器都启动起来。

六、测试
 打开浏览器,输入https://SHENG_NOTEBOOK/index.jsp,如果不出意外的话,应该会显示以下内容:
 
 

可以看到,在mycluster中的服务器上已经得到了客户证书。
如果连接服务器不成功的话,看看客户证书有没有安装??

 

 

另外,用Apache作Proxy也是可以的,配置与本文相差不太大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章