首页 新闻 会员 周边

c# WSE 3.0 调用Java cxf wss4j 需要jks 证书的webservice

0
悬赏园豆:40 [已解决问题] 解决于 2014-07-18 11:51

不用加密的webservice我已经实现,但在需要jks证书方面一筹莫展,有这方面技术的朋友吗?

cwcls的主页 cwcls | 初学一级 | 园豆:27
提问于:2014-07-17 14:45
< >
分享
最佳答案
0
收获园豆:40
Launcher | 高人七级 |园豆:45045 | 2014-07-17 14:47

谢谢您的回复。

webservice 的服务端是java 客户端是c# WSE 3.0. jks 与cer文件已经存在,现在需要如何做呢?

cwcls | 园豆:27 (初学一级) | 2014-07-17 15:02

@cwcls:    4. Client端开发与WSE 3.0配置     a) 建立客户端项目。建立一个Console Application WSEClient作为客户端。在项目右键菜单选择WSE Settings 3.0... ,勾选Enable this project for Web Services Enhancements并确定。添加下面的命名空间引用。

using Microsoft.Web.Services3; using Microsoft.Web.Services3.Design; using Microsoft.Web.Services3.Security; using Microsoft.Web.Services3.Security.X509; using Microsoft.Web.Services3.Security.Tokens;

    b) 添加Web Service引用。引用地址http://机器A IP/WSEServer/MyService.asmx,千万不能用localhost,否则在机器B上无法访问到。Web Reference Name取名为MyServiceRef。     c) Main函数的代码。

static void Main(string[] args) {     try     {         MyServiceRef.MyServiceWse serviceProxy = new WSEClient.MyServiceRef.MyServiceWse();         serviceProxy.SoapVersion = SoapProtocolVersion.Default;
        //user name token         string userName = Environment.UserName;         byte[] midPassword = System.Text.Encoding.UTF8.GetBytes(userName);         Array.Reverse(midPassword);         string password = Convert.ToBase64String(midPassword);         UsernameToken token = new UsernameToken(userName, password);         serviceProxy.SetClientCredential(token);
        //apply policy         serviceProxy.SetPolicy("ClientPolicy");
        //use the domain proxy for credential         serviceProxy.Proxy = new System.Net.WebProxy("proxy server", true);         serviceProxy.Proxy.Credentials = new System.Net.NetworkCredential("domain account", "password", "domain name");
        //call web service         Console.WriteLine("Calling {0}", serviceProxy.Url);         string result = serviceProxy.HelloWorld();         Console.WriteLine("Result : {0}", result);     }     catch (Exception e)     {         Console.WriteLine(e.Message);     }
    Console.WriteLine("");     Console.WriteLine("");     Console.ReadLine(); }

     上面对serviceProxy.Proxy对象的相关设置,是因为在域环境里面,如果不设置代理以及和代理相关的认证信息,调用Web Service时会有异常,异常信息为:请求因HTTP状态407失败,The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied. 对于Web Service和Client都在本地,或者局域网内不需要使用代理的情况下,这两行代码不需要。     d) 创建安全策略。上面步骤中使用了一个ClientPolicy,但是还没有定义它,接下来就是定义这个安全策略。     首先在机器A(开发环境)的命令行运行下面的命令:certmgr.exe -add -r LocalMachine -s My -c -n MyServiceCert -r CurrentUser -s AddressBook,这个命令将在步骤1中在机器A上建立的证书从Local Machine的Personal拷贝到Current User的Others下面,这是为了在下面定义客户端安全策略的时候能够选择到这个证书。     在项目右键菜单选择WSE Settings 3.0... ,在Policy属性页选择Enable Policy,添加一个Policy命名为ClientPolicy,确定后进入WSE Security Settings Wizard。选择Secure a client application,Client Authentication Method选择Username。勾选Specify Username Token in code。接下来Message Protection的选择跟前面Web Service端的贴图完全一样。然后是选择证书,点击Select Certificate按钮后可以看到MyServiceCert的证书,这个步骤中列出的是在证书管理单元的Current User->Others->Certificates中的看到的证书列表,上面证书拷贝的命令使得在这里能够选择到这份证书。     e) 本地测试。到现在,在开发机器A上面运行Client端,应当可以在Console窗口看到成功调用Web Service的Hello World的结果。
    5. 将Client部署到机器B上测试     将下面几个文件拷贝到机器B的测试目录下:WSEClient.exe、WSEClient.exe.config、wse3policyCache.config,在机器B上用记事本打开wse3policyCache.config文件,将下面这一节点:<x509 storeLocation="CurrentUser" storeName="AddressBook" ... />修改成<x509 storeLocation="CurrentUser" storeName="My" ... />,保存。     然后登陆机器B,运行WSEClient.exe,可以看到运行结果如下。         第一点,在客户端机器B上部署,应当包括服务器端证书的导入,我把这个放在步骤1中了。     第二点,集成在VS2005中的WSE 3.0配置工具,在为客户端选择X.509证书时,只能够从Local Machine或者是Current User的Others(其他人)的Store Name中选择证书,但是我看到有的机器上默认情况下这个Others的Store Name是看不到的,在控制台中也没有地方可以把它添加进来,只能够通过执行某些命令行的操作使它出现。基于这样一种情况,在上面的例子中,我在机器A上开发、配置Client时先用命令把证书拷贝到Current User的Others下,使得配置过程中能够选择到证书。而在机器B上部署测试客户端时,是将证书导入到机器B的Current User的Personal(个人)中,并修改配置文件让WSE从Personal读证书信息。

 
 
分类: Web Service
Launcher | 园豆:45045 (高人七级) | 2014-07-17 15:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册