【问题标题】:How to consume a SOAP service over HTTPS in C#?如何在 C# 中通过 HTTPS 使用 SOAP 服务?
【发布时间】:2011-01-26 21:09:26
【问题描述】:

Web 服务管理员给了我 WSDL、两个证书和一个私钥:

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

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

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 对等方无法验证您的 证书。 (错误代码: ssl_error_bad_cert_alert)

【问题讨论】:

  • @Tommaso:您应该使用过服务参考。什么不起作用?
  • 服务端点是否支持 https 连接?
  • @John Saunders:“添加服务引用”生成一个“空”存根:仅命名空间声明
  • @Wes P:当然,仅支持 https
  • @Tommaso:一定有错误。尝试使用命令行 svcutil.exe 程序生成代码。这样,您就会看到错误是什么。

标签: .net web-services soap ssl https


【解决方案1】:

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

如果您只使用服务,则不需要私钥。我猜你想要使用 https 的 2 路身份验证。如果是这种情况,那么它是如何工作的:

在服务器上,管理员应使用私钥安装证书以启用 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 希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • Firefox 到端点:“SSL 对等方无法验证您的证书。(错误代码:ssl_error_bad_cert_alert)”
    • 管理员说 auth_cert.pem 是“演示证书”,而 auth_private_key.pem 是我“必须用来加密连接”的相对私钥
    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多