【问题标题】:How do I setup SSL over WCF?如何通过 WCF 设置 SSL?
【发布时间】:2015-02-13 15:11:59
【问题描述】:

我在生产环境中收到的错误:

根据验证程序,远程证书无效。
[AuthenticationException:根据验证程序,远程证书无效。] System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken 消息,AsyncProtocolRequest asyncRequest,异常异常)+2755308
System.Net.Security.SslState.StartSendBlob(Byte[] 传入,Int32 计数,AsyncProtocolRequest asyncRequest) +470

生产环境使用三层架构,Web 与 App 对话,App 与数据库对话。 Web 和 App 使用 WCF 服务层通过 SSL (443) 进行通信。我们认为它可能是 IIS7 中的 SSL 证书中的配置或 WCF 配置问题。

我们尝试了什么: 我将应用程序和 Web 中的证书添加到“本地计算机”和“当前用户”的受信任机构。

如果需要,我可以添加我的 WCF Web 配置。

我尝试了以下建议:

https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/ms734695.aspx

"The remote certificate is invalid according to the validation procedure." using Gmail SMTP server

How do I know what the storeName of a certificate?

https://msdn.microsoft.com/en-us/library/ms733813(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/hh556232%28v=vs.110%29.aspx

Self-Hosted WCF Service with Mutual SSL (between Service and Client) fails with 403 Forbidden

【问题讨论】:

  • 您是否尝试过通过构建一个与真实应用程序配置方式相同但仅实现单个 DoNothing() 操作的虚拟应用程序(理想情况下是一个客户端只尝试调用一次DoNothing() 操作)?如果失败,您至少可以确定它位于基础架构中的某个位置,而不是您实际业务代码中的某个位置。
  • 另外,尝试从浏览器连接到端点并查看它的内容(假设您收到错误)。
  • @JeroenMostert 对,我们实现了类似的东西并收到了同样的错误。我们确实注意到证书被颁发给不同的 url,除了 localhost,应用程序和 web 都颁发给 *.some.some... Web 到应用程序地址没有使用相同的颁发给:"... " Web 和应用层尚未向公众开放。
  • 可能和你的服务行为有关,你的服务行为是什么样的?是链式信任还是配对信任,您可以粘贴您的绑定和行为吗?请不要粘贴敏感值并在此处放置一个虚拟值
  • @Bravo11 实际上我们没有在 WCF 中包含行为,我们只是使用了 security mode="transport" 和 clientCredentialType="None" 的绑定。我想我读过一篇关于使用行为而不是上述绑定的帖子。在这里:stackoverflow.com/questions/6514067/wcf-ssl-service 一个比另一个更好用吗?

标签: c# asp.net wcf ssl


【解决方案1】:

此答案适用于您将带有有效负载的证书发送到 HTTPS 端点的客户端证书。

您需要确保您信任该证书,您信任创建它的证书颁发机构,并且您在受信任的存储中拥有该 CA 的证书。

您是否可以访问系统(不是 WCF 服务)上需要提供证书的简单网页? 即:https://mysite/test.aspx 这将允许您在 WCF 之外测试证书,并将 WCF 问题与 IIS 问题分开。

1) 确保您已在 IIS 中设置证书映射。 http://www.iis.net/configreference/system.webserver/security/authentication/clientcertificatemappingauthentication http://blogs.msdn.com/b/asiatech/archive/2014/02/13/how-to-configure-iis-client-certificate-mapping-authentication-for-iis7.aspx

短 tl;dr;我们所做的:

  • 将您的客户端证书添加到您的证书存储区(私钥)
  • 为本地用户添加用户
  • 转到 IIS 并将证书映射到您创建的用户
  • 运行 winhttpcfg.exe 为您的应用程序池的用户提供 访问该证书

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384088%28v=vs.85%29.aspx

2) 确保您的 web.config 设置正确 (我们的示例允许通过 HTTP 和 HTTPS 访问端点)

<bindings>
   <basicHttpBinding>
     <!-- Secure Bindings -->
     <binding name="secureHttpBinding">
       <security mode="Transport">
         <transport clientCredentialType="Certificate" />
       </security>
      </binding>

      <binding name="httpBinding">
        <security mode="None" />
      </binding>
   </basicHttpBinding>
</bindings> 

<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviour">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

<services>
         <!-- Person Revised Service-->
        <service name="Services.PRPA_AR101202" behaviorConfiguration="ServiceBehaviour">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="secureHttpBinding" contract="Services.IPRPA_AR101202"></endpoint>
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding" contract="Services.IPRPA_AR101202" />
        </service>
</services>

同样,此答案适用于带有消息的客户端证书,如果只是常规 HTTP,则可以忽略它

【讨论】:

  • 我得到了解决方案,我将查看我在这里写的所有内容以及您的答案,看看它是否匹配。我最终使用了 wsHttpBinding。事实证明,我不明白如何正确设置服务模型及其跨层的绑定。
猜你喜欢
  • 1970-01-01
  • 2014-11-01
  • 2023-01-30
  • 1970-01-01
  • 2022-06-17
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
相关资源
最近更新 更多