上一篇提到在NGINX中配置了双向SSL的验证, 签名信息及公私钥对都是用OPENSSL生成. 并且用生成的CLIENT端证书放在浏览器上可正常调用,但WEB-SERVICE方式调用却没有试过. 平常WEB-SERVICE的双向SSL都是用KEYTOOL工具生成公私钥信息及签名信息,所以这次同样试一下用KEYTOOL来处理OPENSSL的证书.
很感谢这篇博文:http://wenku.baidu.com/view/a00daa2a3169a4517723a351.html 给我带来的灵感.
接着上一篇http://lvjun106.iteye.com/blog/1892533 , 我用OPENSSL生成了ca根证书的私钥ca.crt和客户端client.crt.
接着我用KEYTOOL工具把这两个私钥都同时导入到信任库中client.keystore
keytool -import -v -trustcacerts -alias ca_root -file ca.crt -storepass 1111 -keystore client.keystore
keytool -import -v -alias ipclient_private_key -file client.crt -keypass 1111 -storepass 1111 -keystore client.keystore
接着,可以查看一下这个keystore 的详细信息keytool -list -v -keystore client.keystore
JAVA客户端调用SSL WEB SERVICE
System.setProperty("javax.net.ssl.keyStore", "F:/workspace/TemporaryProgram/cert/client02.p12");
System.setProperty("javax.net.ssl.keyStorePassword","client02");
System.setProperty("javax.net.ssl.keyStoreType","PKCS12");
System.setProperty("javax.net.ssl.trustStore", "F:/workspace/TemporaryProgram/cert/client.keystore");
System.setProperty("javax.net.ssl.trustStorePassword","client02");
System.setProperty("javax.net.ssl.trustStoreType", "jks");
String endpointURL = "https://192.168.40.129:8443/XXXX/services/supplier?wsdl";//
// Web服务端点地址
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpointURL));
call.setOperationName(new QName("http://test.com", "getSupplierByCode"));// 设置操作的名称。
call.addParameter("systemSecurityCode", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型
call.addParameter("code", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型
call.setReturnType(XMLType.XSD_STRING);// 返回的数据类型
Double ret = (Double) call.invoke(new Object[] { "fdsaf","fdsafdas"});// 执行调用
System.out.println("使用HTTP协议来作为Web服务的传输协议!");
System.out.println("已经成功调用。请参看服务端的输出!");