用JMX安全连接WebSphere6.1服务器

前一阶段一直做WebSphere6.1服务器监控研究,网上的资料不多,也不全,自己翻译加领悟,终于实现了全部的功能,下来就分享一下我的成果。

1问题的突破点PerfServletApp.ear

我在WebSphere根目录AppServer\installableApps里找到了这个程序,部署到WebSphere服务器上,发现它可以获得服务器的所有监控数据。这对我来说很有用,因为我还不知道WebSphere有哪些组件有哪些指标可以监控。我用jd-gui这个java反编译工具将这个程序反编译过来,修改了反编译产生的错误,并添加了所需的jar包,它就可以部署到我的tomcat并监控WebSphere了。

使用Search and Replace工具(它可以搜索jar)在WebSphere安装目录下找到了所需的jarcom.ibm.ws.admin.client_6.1.0.jarcom.ibm.ws.security.crypto_6.1.0.jaribmpkcs.jarws_runtime.jarservlet-api.jar。要注意com.ibm.ws.admin.client_6.1.0.jarws_runtime.jar两个jar包中都有javax.servlet的东西,这和tomcatcommon\lib中的servlet-api.jar是冲突的,必须用winrar打开这两个jar包,手工删除掉javax文件夹,否则这两个jar包加载不了!

这几个jar包是必须的(找了好久!最后还是通过在程序中添加System.setProperty("javax.net.debug", "ssl");这句话才调试出了错误原因),因为正常情况下WebSphere服务器安装的时候都添加了安全性,也就是说登录console端是需要输入密码的。所以我们使用JMX连接WebSphere的时候就要接受WebSphere的认证。

2使用SSL soap连接方式

为了搞懂这种连接方式如何运作,花费了我很大的工作量。最终在某贴吧上找到了篇神贴,成功导入了证书(参考附件《websphere6.1证书导入.rar》)。然后就是修改PerfServletAppAdminClient的获取方法了,因为它使用的是AdminServiceFactory.getAdminService()直接从服务器上获得客户端的办法,而我的目标是在我的tomcat上部署,此方法显然不行。下面贴出我的完整连接方法:

public static AdminClient createConncetion() {
//    	System.setProperty("javax.net.debug", "ssl");
//    	Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
//    	Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
		AdminClient adminClient = null;
		Properties connectProps = new Properties();
		connectProps.setProperty(AdminClient.CONNECTOR_TYPE,
				AdminClient.CONNECTOR_TYPE_SOAP);
		connectProps.setProperty(AdminClient.CONNECTOR_HOST, "192.168.1.152");
		connectProps.setProperty(AdminClient.CONNECTOR_PORT, "8880");
		connectProps.setProperty(AdminClient.USERNAME, "admin");
		connectProps.setProperty(AdminClient.PASSWORD, "pwd");
		connectProps
				.setProperty(AdminClient.CONNECTOR_SECURITY_ENABLED, "true");
		connectProps.setProperty("javax.net.ssl.trustStore",
				"c:/test/trust.jks");
		connectProps.setProperty("javax.net.ssl.keyStore", "c:/test/store.jks");
		connectProps.setProperty("javax.net.ssl.trustStorePassword", "trust");
		connectProps.setProperty("javax.net.ssl.keyStorePassword", "key");
		try {
			adminClient = AdminClientFactory.createAdminClient(connectProps);

		} catch (ConnectorException e) {
			e.printStackTrace();
		}
		return adminClient;
	} 

 

 

 

 

你可能感兴趣的:(tomcat,.net,IBM,Security,websphere)