7.4.2 有WS-Security的客户端调用
有WS-Security的Web Service调用需要配置Web Service的安全认证信息。首先需要制作证书,Java中存放证书的文件后缀名以jks结尾,即Java Key Store。每个证书有一个唯一标识,我们这里的唯一标识由证书中Issuer和Serial Number两部分组成。其中Issuer和数据库中的AppID关联。
这里重点介绍如何制作证书,以及如何使用证书来调用WebService。
制作证书
1.用keygen.bat脚本生成jks密钥库,内含客户端私钥和服务端公钥,命令如下:keygen mike 123456 0001.jks 123456 0001.rsa 0001。
代码7.10 keygen.bat 01 echo alias %1 02 echo keypass %2 03 echo keystorename %3 04 echo keystorepass %4 05 echo keyname %5 06 echo cn %6 07 08 keytool -genkey -alias %1 -keypass %2 -keystore %3 -storepass %4 -dname "cn=%6" -keyalg RSA 09 keytool -selfcert -alias %1 -keystore %3 -storepass %4 10 keytool -export -alias %1 -file %5 -keystore %3 -storepass %4 |
keygen参数说明:
参数1:alias密钥别名。
参数2:密钥密码。
参数3:钥匙包(库)。
参数4:钥匙包密码。
参数5:导出的公钥名称。
参数6:AppID。
2.使用JDK自带的工具Keytool导入服务端公钥alisoft.rsa到isvdemo.jks。命令如下:
Keytool -import -alias mike-file server.rsa –keystore 0001.jks -storepass 123456
调用Web Service
完成证书的制作后,接下来需要使用证书调用Web Service,代码如下:
代码7.11 TestWS.java 01 package com.test.api.account; 02 03 ... 04 05 public class TestWS { 06 private static AppConsumeServicePortType service; 07 08 public static void main(String args[]) throws Exception { 09 connectWebService("client01.properties", "alias", "password"); 10 String result = 11 service.checkBalance("testappId", "testInstanceId", 1.0); 12 System.out.println(result); 13 } 14 15 public static void connectWebService(String configPath, String user, 16 String password) throws MalformedURLException { 17 String serviceUrl = "http://10.0.4.138:1688/webservice/App ConsumeService"; 18 XFireProxyFactory serviceFactory = new XFireProxyFactory(); 19 Service serviceModel = new ObjectServiceFactory() 20 .create(AppConsumeServicePortType.class); 21 service = (AppConsumeServicePortType) serviceFactory.create( 22 serviceModel, serviceUrl); 23 setSecureProperty(service, configPath, user, password); 24 } 25 26 public static void setSecureProperty(Object oproxy, String configPath, 27 String user, String password) { 28 Client client = ((XFireProxy) Proxy.getInvocationHandler (oproxy)) 29 .getClient(); 30 31 client.addOutHandler(new DOMOutHandler()); 32 33 Properties properties = new Properties(); 34 properties.setProperty(WSHandlerConstants.ACTION, 35 WSHandlerConstants.SIGNATURE); 36 properties.setProperty(WSHandlerConstants.SIG_PROP_FILE, configPath); 37 properties.setProperty(WSHandlerConstants.USER, user); 38 ClientUtPasswordHander.addPWMockDB(user, password); 39 properties.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, 40 ClientUtPasswordHander.class.getName()); 41 properties.setProperty(WSHandlerConstants.SIG_KEY_ID, "IssuerSerial"); 42 43 client.addOutHandler(new WSS4JOutHandler(properties)); 44 } 45 } |