近日项目上使用Tomcat发布了一个Web Service服务,客户要求实现HTTPS的SSL安全技术提供服务接口,以下做个备份。


一、单向认证

1. 首先使用Keytool工具生成服务端的Keystore文件,Keytool工具实现确认下机器上是否配置了JDK的环境变量,如果没有的话需要进入JDK的当前目录执行命令了

    keytool -genkey -alias webService_server -keystore server.keystore -keyalg RSA  -keysize 4096 -storetype JKS

2. 导出服务端RSA证书并将证书导入到客户端truststore文件中,信任库文件被客户端使用,用于对服务端身份验证

    keytool -export -alias webService_server -file webServiceServer.cer -storepass 123456a? -keystore server.keystore -storetype JKS

    keytool -import -file webServiceServer.cer -storepass 123456a? -keystore client.truststore -alias serverkey -noprompt

3. 配置Tomcat根目录下conf/server.xml文件中以下内容,去注释

<Connector port="8443" protocol="HTTP/1.1" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" disableUploadTimeout="true" SSLEnabled="true"

acceptCount="100" debug="0" scheme="https" secure="true" clientAuth="true" keystoreFile="server.keystore" keystorePass="password"sslProtocol="TLS" />

4.部署Axis服务,这里就不写如何部署了,直接启动Tomcat查看Wsdl
https://localhost:8443/ws/services/axisWS.Test?wsdl
以上步骤完成了服务端的配置,下面是客户端的调用方式

5. 客户端调用代码

public static void main(String[] args) {
		try {
			String endpoint = "https://localhost:8443/eomsWS/services/axisWS.Test";
			// 1.创建service对象,通过axis自带的类创建
			Service service = new Service();
			URL url = new URL(endpoint);
		       // 通过URL类的构造方法传入wsdlUrl地址创建URL对象
		       // 2.创建服务方法的调用者对象call,设置call对象的属性
			Call call = (Call) service.createCall();
			//配置客户端信任库文件路径
			System.setProperty("javax.net.ssl.trustStore", "E:/keystore/client/client.truststore");
			// 给call对象设置请求的URL属性			
			call.setTargetEndpointAddress(url);
			String serviceName = "sayHello";
			// 给call对象设置调用方法名属性
			call.setOperationName(new QName("http://loushang.ws",serviceName));
			// 给call对象设置方法的参数名、参数类型、参数模式
			call.addParameter("param", XMLType.XSD_STRING, ParameterMode.IN);
			// 设置调用方法的返回值类型
			call.setReturnType(XMLType.SOAP_STRING);
			// 4.通过invoke方法调用webservice
			String param = "1222222";
			String res = (String) call.invoke(new Object[] { param });// 调用服务方法
			System.out.println(res);
		} catch (ServiceException e) {
			e.printStackTrace();
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}6. 运行该代码,如果出现接口输出结果表示连接成功。二、双向认证双向认证较上面的步骤多出一个生成客户端密钥库,并将客户端证书RSA文件导入到服务端信任库文件的过程,步骤如下:1. 在单向认证1,2步骤后生成客户端密钥库keystore文件   keytool -genkey -dname " CN=webService_Client, OU=JN, O=JN, L=JN, S=JN, C=CN" -storepass 123456a? -keystore client.keystore -keyalg RSA -keypass 123456a?2. 导出客户端端RSA证书并将证书导入到服务端端truststore文件中,该信任库文件被服务端使用,用于对客户端端身份验证   keytool -export -file webServiceClient.cer -storepass 123456a? -keystore client.keystore   keytool -import -file webServiceClient.cer -storepass 123456a? -keystore server.truststore -alias clientkey -noprompt3. 在Tomcat下conf/server.xml中的Connector 中添加truststoreFile和truststorePass,配置见单向认证中的3种追加4. 修改客户端调用代码	//配置客户端信任库验证文件路径
	System.setProperty("javax.net.ssl.trustStore", "E:/keystore/client/client.truststore");	//配置服务端信任库验证文件路径	System.setProperty("javax.net.ssl.keyStore", "E:/keystore/client/client.keystore");