wso2/wsf是wso2推出的基于wsf_c的系列web service框架,其关键是提供了对ws-security的全套支持,比如sign、encrytion、timestamp; 目前能够支持的语言包括:Php、Ruby、Perl、C、C++、Java;其中Php我们已经用该框架进行了接入,具体可见http://blog.csdn.net/sfdev/archive/2008/03/29/2228761.aspx;之后对Ruby语言也进行预研,由于之前已经有了Php的经验,WSF/Ruby的环境配置和sample运行没有遇上什么阻碍,但是由于无法验证服务端签名的问题,我们还尝试了wss4r【Web Services Security For Ruby】这个框架,该框架年老失修,很多东西都有问题,特别是对namespace的处理上,很多时候都需要自己修改他的源代码来完成(源码中二选一的情况挺多,一般注释掉一种,保留另外一种,若需要启用注释掉的,则手工将另外一种注释掉);
综合前段时间对各种语言的接入情况,包括Java Xfire、.Net WSE 2.0、.Net WSE 3.0、.Net WCF、Php WSO2/WSF、Ruby WSO2/WSF,各种框架的接入难易程度不通,对wss支持的设计方式也不一样;下面就WSO2/WSF和其他各框架的设计方式及其接入成本等进行下对比;
1、WSO2/WSF是唯一的系列框架集,他在wcf_c【基于AXIS/Rampart思想的C语言实现】的基础上可以扩展到不同语言之上;由于他们的核心是一样的,所有不同语言利用此框架接入时的成本是比较低的,尤其是经历过其中一种语言接入之后;相比较而言,其他的框架都是针对特定语言的,没有通用性;
2、由于WSO2/WSF的核心是WCF_C,他是用C实现的,所以在跟踪bug时非常困难,能够跟踪的级别也就是各语言对WCF_C的封装层面;.Net下面各框架也都有同样的问题,虽然说.Net 3.5所开放了很多的源码,可以在vs2008中进行在线查看,但是我没有成功过;对于这点,java方面自然有得天独厚的优势,基本上能够跟踪到90%以上的源代码,对于security方面的src,可以到sun网站下载scsl版本的源码,默认jdk中的src是没有security和sun部分的源码的;
3、WSO2/WSF对ws-security的实现方式非常不友好!这系列框架可以用于客户端进行ws的调用,也可以用于服务端发布带有security支持的ws;但是他所有相关的参数都是没有客户端和服务端之分的,这加大了理解该框架细节的难度,很多参数无法明确知道其用途及其使用范围,由于无法跟踪源码,很多时候只能通过设置不通的值来进行尝试其返回的结果;其二:在客户端调用或者是服务端接受请求进行处理时,参数设置也是统一的;其实无论对于哪种处理方式(发起或者接收请求),都有两个过程,一个发送和一个接收,这两个过程很多时候需要的参数是不一样的,这在wso2/wsf中就不知道怎么办了!相比较而言,Java和.Net对此的设计就更优美、更具可扩展性;比如Xfire/AXIS2中对于各请求都有OutflowSecurity/InflowSecurity的配置,这两者是互不干扰的,当然两者不是必须的,你可以只设置其一,这要看具体需求;.Net下面的实现方式也比较类似,但是.Net下面更傻瓜化,很多都可以通过工具Step By Step的进行;
4、非.Net语言都无需将证书导入到OS中,可以直接从文件读取,这非常省事;在我们接入各ISV过程中,.Net都是一个耗资源大户,不同环境下面证书导致的问题很多;
5、从证书格式上来说,Java采用jks和der crt,.Net采用pfx和der crt,其他均采用pem和pem crt;当然Java也可以采用pfx格式证书,从服务端为Java这种情况来说,非Java环境下面的证书格式均需要用工具来进行额外转换,当然pem格式的步骤最多;
总的来说,能看到源码真是件幸事啊,不管从哪个角度来说,Java的接入都是最轻松的,在框架的设计上也是最优美的;
PS:在前面的《WSF/PHP调用带有WS-Security支持的Web Service时的注意事项》文章中,我提到该框架暂时不支持服务端签名验证;但实际上这是错误的,框架本身提供了该功能,而且就是通过receiverCertificate参数来加载服务端公钥的;只不过该功能能够支持的服务端security_token_reference类型有限,据我的测试,现在好像只支持KeyIdentifier类型,在框架自带的sample中无论客户端/服务端配置何种类型,返回的始终是KeyIdentifier类型的,而调用也始终成功,但是若服务端不是用WSO2/WSF框架发布的,那返回其他类别的就不能验证了;这在前台没有任何体现,需要查看后台日志文件才行;