最近,很多项目需要把服务通信由http协议变更为https,已增加安全性,在网上参考一些资料,本文档在tomcat上进行修改。
- 使用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个文件就会生成到什么位置。
- 更改tomcat支持https,修改配置文件(server.xml)
添加
<Connector connectionTimeout="20000" 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!
- 客户端测试程序,核心代码。
不再赘述hessian如何发布和调用,详情可查看相关文档。在原有基础上加上红色字体。
public class Test{
public static void main(String[] args) throws Exception {
System.setProperty("javax.net.ssl.keyStore","D:\\client.keystore");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
System.setProperty("javax.net.ssl.trustStore","D:\\client.truststore");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return urlHostName.equals(session.getPeerHost());
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
TestService service = (IdsTest) factory.create(TestService.class, "https://ip:8443/Test/testHessian");
String test = service.getTest();
System.out.println(test);
}
}