Java呼叫使用SSL/HTTPS協議來傳輸的axis webservice服務

上校發表於2017-03-20

使用SSL/HTTPS協議來傳輸 
Web服務也可以使用SSL作為傳輸協議。雖然JAX-RPC並沒有強制規定是否使用SSL協議,但在tomcat 下使用HTTPS協議。 
1、使用JDK自帶的工具建立密匙庫和信任庫。 

1)通過使用以下的命令來建立伺服器端的密匙庫: 

keytool -genkey -alias Server -keystore server.keystore -keyalg RSA 
輸入keystore密碼: changeit 
您的名字與姓氏是什麼? 
[Unknown]: Server 
您的組織單位名稱是什麼? 
[Unknown]: ec 
您的組織名稱是什麼? 
[Unknown]: ec 
您所在的城市或區域名稱是什麼? 
[Unknown]: beijing 
您所在的州或省份名稱是什麼? 
[Unknown]: beijing 
該單位的兩字母國家程式碼是什麼 
[Unknown]: CN 
CN=Server, OU=ec, O=ec, L=beijing, ST=beijing, C=CN 正確嗎? 
[否]: y 

輸入 <Server>的主密碼 
(如果和 keystore 密碼相同,按回車): 
以上命令執行完成後,將獲得一個名為server.keystore的密匙庫。 

2)生成客戶端的信任庫。首先輸出RSA證照: 

keytool -export -alias Server -file test_axis.cer -storepass changeit -keystore server.keystore 
然後把RSA證照輸入到一個新的信任庫檔案中。這個信任庫被客戶端使用,被用來驗證伺服器端的身份。 

keytool -import -file test_axis.cer -storepass changeit -keystore client.truststore -alias serverkey -noprompt 
以上命令執行完成後,將獲得一個名為client.truststore的信任庫。 

3)同理生成客戶端的密匙庫client.keystore和伺服器端的信任庫server.truststore.方便起見給出.bat檔案 
gen-cer-store.bat內容如下: 

set SERVER_DN="CN=Server, OU=ec, O=ec, L=BEIJINGC, S=BEIJING, C=CN" 
set CLIENT_DN="CN=Client, OU=ec, O=ec, L=BEIJING, S=BEIJING, C=CN" 
set KS_PASS=-storepass changeit 
set KEYINFO=-keyalg RSA 

keytool -genkey -alias Server -dname %SERVER_DN% %KS_PASS% -keystore server.keystore %KEYINFO% -keypass changeit 
keytool -export -alias Server -file test_axis.cer %KS_PASS% -keystore server.keystore
keytool -import -file test_axis.cer %KS_PASS% -keystore client.truststore -alias serverkey -noprompt 

keytool -genkey -alias Client -dname %CLIENT_DN% %KS_PASS% -keystore client.keystore %KEYINFO% -keypass changeit 
keytool -export -alias Client -file test_axis.cer %KS_PASS% -keystore client.keystore
keytool -import -file test_axis.cer %KS_PASS% -keystore server.truststore -alias clientkey -noprompt 

好的,現在我們就有了四個檔案:server.keystore,server.truststore,client.keystore,client.truststore 

2、更改Tomcat的配置檔案(server.xml),增加以下部署描述符:(其實裡面有,只是被註釋掉了) 

<Connector port="8440" 
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
enableLookups="false" disableUploadTimeout="true" 
acceptCount="100" scheme="https" secure="true" 
clientAuth="true" keystoreFile="f:\server.keystore" keystorePass="changeit" 
truststoreFile="f:\server.truststore" truststorePass="changeit" 
sslProtocol="TLS" /> 

3、把HelloWorld重新部署一次,在server-config.wsdd中修改如下部署程式碼。(還原了而已) 

<service name="HelloWorld" provider="java:RPC"> 
<requestFlow> 
<handler type="soapmonitor"/> 
</requestFlow> 
<responseFlow> 
<handler type="soapmonitor"/> 
</responseFlow> 
<parameter name="allowedMethods" value="sayHello"/> 
<parameter name="className" value="HelloWorld"/> 
</service> 

4、修改客戶端程式 TestClient.java(修改的部分已標出) 


public class TestClient 

public static void main(String [] args) throws Exception { 
String endpoint = "https://localhost:" +"8440"+ "/axis/HelloWorld";//注意區別在這裡!https! 

System.setProperty("javax.net.ssl.keyStore", "E:\\client.keystore"); 
System.setProperty("javax.net.ssl.keyStorePassword", "password"); 
System.setProperty("javax.net.ssl.trustStore", "E:\\client.truststore"); 
System.setProperty("javax.net.ssl.trustStorePassword", "password"); 

Service service = new Service(); 
Call call = (Call) service.createCall(); 
call.setTargetEndpointAddress( new java.net.URL(endpoint) ); 

call.setOperationName( "sayHello" ); 
String res = (String) call.invoke( new Object[] {} ); 

System.out.println( res ); 

 

 

 

 

生成客戶端程式碼:

wsdl2java -frontend jaxws21 -p client -d D:\Project\demo\testWebService http://127.0.0.1:8080/testWebService/GreetingService?wsdl

        ServiceTest serviceTest = new ServiceTestService().getServiceTestPort();// 初始化物件
        String name = serviceTest.getMessage("那個誰");// 呼叫服務端方法

        System.out.println(n);// 列印返回結果

 

 

相關文章