在 C# 中使用 SSL (https) 使用 Web 服务

Posted

技术标签:

【中文标题】在 C# 中使用 SSL (https) 使用 Web 服务【英文标题】:Consuming web service with SSL (https) in C# 【发布时间】:2012-05-15 21:28:24 【问题描述】:

我想使用 C# 中的 ssl 安全 Web 服务。请求如下所示:

<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:biw="http://tempuri.org/ws_returnTable"
  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
  >
  <soapenv:Header>
    <wsse:Security>
      <wsse:UsernameToken>
        <wsse:Username>sasdemo</wsse:Username>
        <wsse:Password>sasch.111</wsse:Password>
      </wsse:UsernameToken>
    </wsse:Security>
  </soapenv:Header>
   <soapenv:Body>
      <biw:meansclass />
   </soapenv:Body>
</soapenv:Envelope> 

WSDL 中的端点声明如下所示:

<wsdl:service name="meansclass">
  <wsdl:port binding="tns:meansclassSoapBinding" name="meansclassPort">
    <soap:address location="https://sas.ssz.intra.stzh.ch:8443/SASBIWS/services/Shared%20Data/ws/meansclass" /> 
  </wsdl:port>
</wsdl:service>

app.config 如下所示:

<bindings>
    <basicHttpBinding>
        <binding name="meansclassSoapBinding" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            <security mode="Transport">
                <transport clientCredentialType="None" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="UserName" algorithmSuite="Default" />
            </security>
        </binding>
    </basicHttpBinding>
</bindings>
<client>
    <endpoint address="https://localhost:8443/SASBIWS/services/Shared%20Data/ws/meansclass"
        binding="basicHttpBinding" bindingConfiguration="meansclassSoapBinding"
        contract="ServiceReference1.meansclassPortType" name="meansclassPort" />
</client>

我尝试使用该 C# 代码访问 Web 服务:

var service = new meansclassPortTypeClient();

service.ClientCredentials.UserName.UserName = "username";
service.ClientCredentials.UserName.Password = "password";

var test = service.meansclass();

但是meansclass()总是抛出异常。在德语中它说:

“客户端身份验证”类型的异常 (...) 没有安全上下文。

我用谷歌搜索了很多,但没有发现我做错了什么。如何制作这样的“安全上下文”?或者有什么问题?

【问题讨论】:

我认为你需要设置 【参考方案1】:

如果没有其他上下文(WSDL 视图)我正在掌握,但您可能将 SSL 安全性与 Web 服务安全性混淆了,并且服务抱怨 SOAP 标头中存在意外凭据。

SSL 安全性作为传输 Web 服务请求和响应的过程的一部分应用。协调 SSL 交互的要求是客户端通过将证书拉入 C# 使用的信任存储区来信任服务器的证书。

请求中显示的是“消息级别”wss(Web 服务安全)用户名/密码凭证。

建议:

    如果您可以控制服务实施,请确保从 Web 服务中删除任何安全策略。如果您不这样做,并且您不确定服务消费是否需要用户名和密码,请从 soap 标头中删除用户名和密码。 同样,如果您可以控制服务实施,请尝试删除 SSL 要求并执行服务以确定是否可以通过不安全 (http) 连接调用服务。 只添加回 SSL 并检查异常...记住服务器的公共证书必须受运行 C# 的上下文信任。证书通常可以通过在浏览器中访问 Web 服务 (https) 地址并使用浏览器的机制将证书保存到适当的信任库中来获取 (http://balajiramesh.wordpress.com/2007/12/28/save-ssl-certificate-to-cer-file/)

【讨论】:

我也有 SSL 和消息安全。

以上是关于在 C# 中使用 SSL (https) 使用 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .Net C# 中绕过 SSL 证书进行 HTTPS SOAP 请求?

在 C# 中使用 SSL 连接到 MySQL

C# - 使用 feck 的 TLS / SSL Websockets

c# https请求忽略证书验证_各种编程语言忽略http的SSL证书认证

请求被中止 无法在共享托管服务器 C# 上创建 ssl/tls 安全通道

C# https证书通信Post/Get(解决做ssl通道时遇到“请求被中止: 未能创建 SSL/TLS 安全通道”问题)