如何在C#中通过HTTPS使用SOAP服务?

时间:2011-01-26 21:09:26

标签: .net web-services soap ssl https

Webservice管理员给了我WSDL,两个证书和一个私钥:

service.wsdl
ssl.cer
auth_cert.pem
auth_private_key.pem

Visual Studio 2010 中,我从WSDL添加了Web引用(服务引用不起作用)。 然后我尝试使用它,因为它是一个http肥皂客户端:

MySoapClient client = new MySoapClient();
client.Operation();

我获得了这个堆栈跟踪:

Unhandled Exception: System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
   at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)

我与证书和私钥有什么关系?
我找不到任何在线教程,也没有涉及此事的书籍。任何提示?

更新

使用 Firefox 访问端点:

  

SSL peer无法验证您的身份   证书。 (错误代码:   ssl_error_bad_cert_alert)

2 个答案:

答案 0 :(得分:6)

  

Webservice管理员给了我WSDL,   两个证书和一个私钥

如果您只使用该服务,则不需要私钥。我猜你想用https进行双向认证。如果是这种情况,这是它的工作原理:

在服务器上,管理员应使用私钥安装证书以启用SSL(在SSL握手期间使用密钥)。客户端使用其公钥来检查证书是否有效并验证服务,因此在客户端,您需要检查它。如果两台计算机都在Windows域中,则这很容易(可以配置为使用域证书颁发机构)。如果没有,则需要将用于签署原始服务器证书的所有证书安装在客户端计算机上(在受信任的根CA存储中)。

第二部分是对服务器的客户端身份验证。您将客户端证书(它包含公钥)安装到个人存储并配置WCF代理以使用它:

<behaviors>
    <endpointBehaviors>
        <behavior name="certSecureBehavior">
            <clientCredentials>
                <clientCertificate findValue="client-CN" storeLocation="LocalMachine" x509FindType="FindBySubjectName" storeName="My"/>
                <serviceCertificate>
                    <defaultCertificate findValue="server-CN" storeLocation="LocalMachine" x509FindType="FindBySubjectName" storeName="TrustedPeople"/>
                </serviceCertificate>
            </clientCredentials>
        </behavior>
    </endpointBehaviors>
</behaviors>

配置端点以使用此行为。几点说明:

  • client-CN是为(不太重要)
  • 生成客户端证书的名称
  • server-CN是为其生成服务器证书的名称(通常是服务器DNS名称)

这是一个非常复杂的主题,总是需要大量的时间来研究。 查看这篇文章http://blogs.msdn.com/b/imayak/archive/2008/09/12/wcf-2-way-ssl-security-using-certificates.aspx 希望这有帮助。

答案 1 :(得分:0)

管理员似乎已经为您提供了用于在服务器上设置SSL的文件。您应该能够通过WSDL.exe运行service.wsdl来生成C#代理,这是VS在添加Web引用时所执行的操作。我不认为这是你的问题。您看到网络级别问题,因为异常是System.Net.WebException。

其他文件看起来像是管理员用来将SSL添加到服务器的内容。通过共享私钥,如果使用此密钥的任何启用SSL的服务,他可能已经破坏了安全性。您应该在WSDL中查找任何服务端点,并尝试通过SSL(https://)访问浏览器中的端点。如果您不能,则存在服务器配置问题。更正服务器上的SSL配置,您的WSDL应该可以工作,或者至少你会有一个新问题。