首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现一个在SSL上使用C#的WebServices客户端?

实现一个在SSL上使用C#的WebServices客户端?
EN

Stack Overflow用户
提问于 2009-05-12 17:25:43
回答 5查看 27K关注 0票数 15

因此,我已经将一个ServiceReference添加到了一个C#控制台应用程序中,该应用程序调用了一个从C#公开的Web。

我已经完成了所有的设置,当它不使用SSL (http)时,它就像桃子一样工作。我现在正在尝试使用SSL来设置它,并且我在将它添加到服务引用(甚至Web引用)时遇到了问题。例如,当我尝试将服务添加到Visual中时,服务公开的URL (https)没有返回适当的web方法。

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

我遇到的另一个难题是证书管理和部署。我有大约1000个外部客户端站点需要使用这个小工具,它们需要安装在适当的cert存储中的证书才能连接到Web服务。不确定处理这个问题的最佳方法。他们需要去根店吗?

我花了好几个小时在网上寻找各种各样的选择,但在任何地方都找不到一个很好的答案。

总之,我有几个问题要问:

1)在Visual中设置使用SSL的Web服务有哪些好的链接?

2)如何注册证书?它应该在哪一家店存在?我可以用像CertMgr这样的东西来注册吗?

一定有一本好的书/教程/任何东西,它将向我展示关于设置这样的东西的共同的良好实践。我只是找不到它!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-05-22 13:20:03

我已经想出办法了。我花了很长时间才谈到这个问题,但我想和大家分享我的解决方案,因为看到这个标准对我来说是个很大的麻烦。“噢,我修好了!谢谢!”让每个人都关注到底发生了什么的帖子。

所以。

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

当您使用“添加服务引用.”在Visual 2008中,服务点管理器的无法指定安全协议应该是SSL3。

除非。

您需要一个静态的WSDL文档和使用wsdl.exe生成代理类

代码语言:javascript
运行
复制
wsdl /l:CS /protocol:SOAP /namespace:MyNamespace MyWebService.wsdl

然后可以使用C夏普编译器将代理类转换为库(.dll),并将其添加到.Net项目的“引用”中。

代码语言:javascript
运行
复制
csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll MyWebService.cs

此时,您还需要确保在“引用”中也包含了System.Web.Services。

现在,您应该能够调用您的web服务,而不会出现代码中的问题。为了使工作,,您需要在实例化服务之前添加一行神奇的代码。

代码语言:javascript
运行
复制
// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

好吧,所以我对自己印象很深,因为测试在我的研发箱上是很棒的。然后,我部署到另一个客户端框,由于权限/权限问题,它将不再连接。对我来说,这闻起来像是证书(不管它们闻起来是什么味道)。要解决这个问题,我旧certmgr.exe将站点的证书注册到本地机器上的受信任根。

代码语言:javascript
运行
复制
certmgr -add -c "c:\someDir\yourCert.cer" -s -r localMachine root

这允许我将证书分发到我们的客户站点,并为用户自动安装它。我仍然不确定windows的不同版本对于像这样的自动证书注册会有多大的“安全友好性”,但是到目前为止,它工作得很好。

希望这个答案对一些人有帮助。感谢飞镖,感谢你在这方面的所有帮助,并提供一些洞察力。

票数 32
EN

Stack Overflow用户

发布于 2009-05-20 13:26:09

听起来,web服务使用的是自签名证书。坦率地说,这不是最好的方法。

假设您是一个大型组织,并且是内部的,您可以设置您自己的受信任的证书颁发机构,这对于活动目录来说尤其容易。从该CA中,承载Oracle服务的服务器可以请求证书,您可以使用AD策略信任内部CA的根证书,方法是将其放置在机器存储的受信任根目录中。这将消除手动信任或接受web服务上的证书的需要。

如果客户端机器是外部的,那么您必须让公开服务的人员从著名的CA(如Verisign.Thawte、GeoTrust等)购买“真实”证书,或者作为安装过程的一部分,将公共证书捆绑在每台机器上的受信任根证书颁发机构中。这有问题,例如无法撤消证书,但将删除提示符。

票数 4
EN

Stack Overflow用户

发布于 2009-07-29 18:26:07

垫子,

我也有这样的问题,我有一种避免使用certmgr.exe在远程计算机上向受信任的根添加证书的方法。

代码语言:javascript
运行
复制
X509Store store;
store = new X509Store("ROOT", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);

可以这样创建“证书对象”:

代码语言:javascript
运行
复制
X509Certificate2 certificate = new X509Certificate2("Give certificate location path here");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/853896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档