最近,客户想把服务通信有http协议变更为https增加安全性,以为修改下tomcat,配置下就OK了,但我们的客户端请求SSO服务器的Webservice请求走的是http,这就发生了悲剧。
怎么办?
先从配置tomcat开始做起吧:
1、 使用JDK自带的工具创建密匙库和信任库。
使用keytool生成密钥库和信任库
如下4个文件:
client.keystore,client.truststore,server.keystore,server.truststore
为了方便大家,我将命令行写入脚本。
脚本如下,存入bat文件:
set SERVER_DN="CN=Server, OU=ths, O=ths, L=BEIJING, S=BEIJING, C=CN" set CLIENT_DN="CN=Client, OU=ths, O=ths, L=BEIJING, S=BEIJING, C=CN" set KS_PASS=-storepass 123456 set KEYINFO=-keyalg RSA keytool -genkey -alias Server -dname %SERVER_DN% %KS_PASS% -keystore server.keystore %KEYINFO% -keypass 123456 keytool -export -alias Server -file ths_https.cer %KS_PASS% -keystore server.keystore keytool -import -file ths_https.cer %KS_PASS% -keystore client.truststore -alias serverkey -noprompt keytool -genkey -alias Client -dname %CLIENT_DN% %KS_PASS% -keystore client.keystore %KEYINFO% -keypass 123456 keytool -export -alias Client -file ths_https.cer %KS_PASS% -keystore client.keystore keytool -import -file ths_https.cer %KS_PASS% -keystore server.truststore -alias clientkey -noprompt
密码我设置的是123456,这个你可以自己设定,把脚本中所有的123456替换掉就可以了,其他参数(文件名称啥的)无所谓。
注:在什么位置执行该脚本,这4个文件就会生成到什么位置。
2、 更改tomcat支持https,修改配置文件(server.xml)
增加:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https"secure="true" clientAuth="false"
keystoreFile="d:\server.keystore"keystorePass="123456"
truststoreFile="d:\server.truststore" truststorePass="123456"
sslProtocol="TLS" />
注:红色路径指向上一步中生成的server.keystore和server.truststore,根据自己的实际情况填写。
端口号可根据实际情况修改
去掉:
<ListenerclassName="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on" />
重启tomcat,OK!
再来配置Axis
在server-config.wsdd中修改name为SSOService的节点,增加红色部分
<service name="SSOService"provider="java:RPC"> <requestFlow> <handler type="soapmonitor"/> </requestFlow> <responseFlow> <handler type="soapmonitor"/> </responseFlow> <parametername="allowedMethods" value="*" /> <parametername="className"value="com.ths.platform.sso.services.SSOService" /> </service>
注:使用Axis 一般server-config.wsdd再web-inf目录下。
4、客户端测试程序,核心代码。不再赘述Axis如何发布和调用Webservice,不懂的,可以自己上网搜索
public class Test { public static void main(String [] args) throws Exception { //这里是https String endpoint = "https://localhost:" +"8443"+ "/axis/HelloWorld"; //client.keystore和client.truststore路径根据自己情况填写 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"); //关键是上面几行代码,下面是调用Webservice常规步骤 Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName( "sayHello" ); String result = (String) call.invoke( new Object[] {} ); System.out.println( result ); } }
早晨刚刚拿到这个问题的时候,感觉有些棘手,如果懂得基本的原理,有Webservice和https基础,其实并不困难。
加油,各位。