实现使用SSL上的Web服务的C#客户端?

Mat*_*sky 14 c# ssl web-services console-application visual-studio

所以我已经将一个ServiceReference添加到C#控制台应用程序中,该应用程序调用从Oracle公开的Web服务.

我已经完成了所有设置,当它不使用SSL(http)时,它就像桃子一样.我现在正尝试使用SSL进行设置,并且我遇到了将其添加到服务引用(甚至Web引用)的问题.例如,当我尝试将该服务添加到Visual Studio时,该服务所在的URL(https)未返回相应的Web方法.

底层连接已关闭:发送时发生意外错误.从传输流中收到意外的EOF或0字节.元数据包含无法解析的引用:' https ://srs204.mywebsite.ca: 7776/ SomeDirectory/ MyWebService?WSDL '

我遇到的另一个窘境是关于证书管理和部署.我有大约1000个外部客户端站点需要使用这个小实用程序,他们需要安装在相应的证书库中的证书才能连接到Web服务.不确定处理此问题的最佳方法.他们需要在根商店吗?

我花了几个小时在网上查看各种选项,但无法在任何地方得到一个干净的答案.

总而言之,我在这里有几个问题:

1)在Visual Studio中使用SSL设置Web服务的人有什么好的链接吗?

2)我应该如何注册证书?应该存在哪个商店?我可以使用像CertMgr这样的东西进行注册吗?

必须有一本好的书/教程/任何能够向我展示设置这样的东西的常见良好实践的东西.我似乎无法找到它!

Mat*_*sky 31

好吧,我已经想到了这一点.我花了很长时间来讨论,但我想分享我的解决方案,因为看到标准是我的一个巨大的诱惑."哦,我修好了!谢谢!" 这些帖子让每个人都挂在实际发生的事情上.

所以.

根本问题是默认情况下,Visual Studio 2008使用TLS进行SSL握手,而我尝试连接的基于Oracle/Java的Webservice使用SSL3.

在Visual Studio 2008中使用"添加服务引用..."时,您无法指定服务点管理器的安全协议应为SSL3.

除非.

您获取静态WSDL文档并使用wsdl.exe生成代理类.

wsdl /l:CS /protocol:SOAP /namespace:MyNamespace MyWebService.wsdl
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用C Sharp编译器将该代理类转换为库(.dll)并将其添加到.Net项目"References"中.

csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll MyWebService.cs
Run Code Online (Sandbox Code Playgroud)

此时,您还需要确保已在"引用"中包含System.Web.Services.

现在,您应该能够在代码中没有问题的情况下调用您的Web服务.为了使其工作,您需要在实例化服务之前添加一行神奇的代码.

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Run Code Online (Sandbox Code Playgroud)

好吧,所以我对自己印象非常深刻,因为我的开发盒测试很棒.然后我部署到另一个客户端框,由于权限/权限问题它将无法再次连接.这闻起来像我的证书(无论它们闻起来像什么).为解决此问题,我使用certmgr.exe将站点的证书注册到本地计算机上的受信任根.

certmgr -add -c "c:\someDir\yourCert.cer" -s -r localMachine root
Run Code Online (Sandbox Code Playgroud)

这允许我将证书分发到我们的客户端站点并自动为用户安装.我仍然不确定不同版本的Windows对于像这样的自动证书注册的"安全友好"程度如何,但它到目前为止工作得很好.

希望这个答案可以帮助一些人.感谢blowdart也为您提供了所有帮助,并提供了一些见解.