软件SSL的实践
因为当前所有的单元测试都是通过我提供的ASF模板类,所以启动的Web Service都是服务框架中Jetty发布的Web Service,很轻量级,没有以往测试Web应用的复杂,不需要单独去启动一个Web Container。前期对于WS-Security的集成已经使得单元测试可以支持带WS-Security的Web Service的测试。
抱着试一试的心理,直接用服务框架发布了SSL的Web Service,客户端调用了一下,没有成功,但是错误还不能定位是客户端还是服务端的问题,因此首先去外部配置了Tomcat来建立了一个SSL服务端。
Tomcat SSL服务端的配置:(只需要修改一个文件conf/server.xml)
<Connector port=”8443″ maxHttpHeaderSize=”8192″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” disableUploadTimeout=”true”
acceptCount=”100″ scheme=”https” secure=”true”
clientAuth=”false” sslProtocol=”TLS” keystoreFile=”D:/work/asf/webservice/src/conf.test/keys/alisoft.jks”
keystorePass=”alisoft” keystoreType=”jks” truststoreFile=”D:/work/asf/webservice/src/conf.test/keys/alisoft.jks”
truststorePass=”alisoft” truststoreType=”jks”/>
clientAuth没有必要配置成为true,不需要重复反向再认证。如果这个值设为false。其他几个值就是生成的服务端证书库位置及密码。这里所要注意的就是要求keystore密码和私钥密码一样,因为只有一个配置密码的地方,这在生成公钥密钥对时两者密码写成一致。这样就OK了,直接访问8443端口就能作为https来访问服务了。
采用XFire客户端来做单元测试,代码如下:
public static void SSLSecurityTest()
{
Service serviceModel = new ObjectServiceFactory().create(IAccountService.class);
//https的客户端代码需要增加的
System.setProperty ( “java.protocol.handler.pkgs” , “com.sun.net.ssl.internal.www.protocol” );
System.setProperty ( “javax.net.ssl.keyStore” , “D:/work/asf/webservice/src/conf.test/keys/myisvdemo.jks” );
System.setProperty ( “javax.net.ssl.keyStorePassword” , “myisvdemo” );
System.setProperty ( “javax.net.ssl.trustStore” , “D:/work/asf/webservice/src/conf.test/keys/myisvdemo.jks” );
System.setProperty ( “javax.net.ssl.trustStorePassword” , “myisvdemo” );
System.setProperty (“java.protocol.handler.pkgs”,”com.sun.net.ssl.internal.www.protocol”);
Security.addProvider ( new com.sun.net.ssl.internal.ssl.Provider());
String serviceUrl = “http://localhost:8080/axis2/services/AccountService”;
String serviceHttpsUrl = “https://localhost:8443/xfire/services/AccountService”;
String serviceHttpsUrl2 = “https://localhost:8443/axis2/services/AccountService”;
try
{
IAccountService service = (IAccountService)serviceFactory.create(serviceModel,serviceHttpsUrl2);
//WS-Security所需要的配置
Client client = ((XFireProxy)Proxy.getInvocationHandler(service)).getClient();
client.addOutHandler(new DOMOutHandler());
Properties properties = new Properties();
properties.setProperty(WSHandlerConstants.ENABLE_SIGNATURE_CONFIRMATION, “false”);
properties.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.SIGNATURE);
//properties.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP);
properties.setProperty(WSHandlerConstants.SIG_PROP_FILE, “keys/client.properties”);
//properties.setProperty(WSHandlerConstants.USER, “myisvdemo”);
properties.setProperty(WSHandlerConstants.USER, “wenchu”);
properties.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, ClientUtPasswordHander.class.getName());
//properties.setProperty(WSHandlerConstants.SIG_KEY_ID, “IssuerSerial”);//”DirectReference”,”IssuerSerial”,”SKIKeyIdentifier”
properties.setProperty(WSHandlerConstants.SIG_KEY_ID, “SKIKeyIdentifier”);
client.addOutHandler(new WSS4JOutHandler(properties));
AccountBean[] result = service.getUserAccountList(“te”, “ta”);
System.out.println(result.length);
}
catch(Exception ex){ex.printStackTrace();}
}
这样保证了客户端的配置已经没有问题了,因此就主要将ASF框架中的SSL集成进去。由于ASF中集成的是Jetty,因此只需要在Jetty动态建立Mapping Server的时候,Server的connector为以SslSocketConnector类型来构造,这样就可以响应https的部分了,同时也可以在其它端口发布成为不需要SSL的服务。这里细节就略去了,改造不是很复杂,只需要对Jetty较为了解即可。不过这里还是要赞一下Jetty,真是轻量级的好东西啊。集成以后再次作单元测试,OK,测试通过。
.Net的客户端测试
最后就需要对.net所SSL的测试,由于.net客户端已经在上次配置了policy作为WS-Security的配置,按照常理来说应该不需要再配置证书之类的东西了,就尝试着做了一下,在建立Web Reference的时候会有提示说证书授权的认证不符合要访问的地址的身份,这个可以忽略。然后接下去测试了一下,就总是提示无法建立TLS/SSL的交互通道,查了一下,只需要加入下面一句话即可:
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
它的作用就是接受所有的证书,也就是在我们SSL中的流程中,检查证书CA是否受信这部分省略,就好比我们访问一些非受信证书的网站跳出的提示框我们点击确认一样。
到此为止,应用服务器的SSL配置和测试就基本结束了。后面要谈到的就是硬件SSL的结构和设计。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
如何从Web转到移动业务应用
一般移动业务应用只会提供企业Web应用的一部分功能。当从Web转向移动应用时,开发团队的最大挑战是决定为移动应用开发哪些功能以及如何交付这些功能。
-
从Web开发到交付:2015必备深度前端知识
过去这几十年,互联网已被证明是影响技术世界的最复杂最难以预测的系统之一。软件往往是基于部署在本地硬件(或至少本地网络)上的假设来进行设计的。
-
新程序语言将不同Web语言融合在一起
如果你是一名Web开发者,你最喜欢哪种编程语言?CSS?JavaScript?PHP?HTML 5?为什么选择这种语言?
-
PHP终于迎来了自己的正式语言规范
尽管PHP脚本语言早在1995年左右就已经诞生并在Web开发领域占据着重要地位,但其一直没有自己的正式语言规范——只提供广泛的用户说明文档。