使用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);// 列印返回結果