C# 如何通过WCF设置SSL?

C# 如何通过WCF设置SSL?,c#,asp.net,wcf,ssl,C#,Asp.net,Wcf,Ssl,我在生产环境中收到的错误: 根据验证过程,远程证书无效。 [身份验证异常:根据验证过程,远程证书无效。] System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken消息、AsyncProtocolRequest、asyncRequest、异常)+2755308 System.Net.Security.SslState.StartSendBlob(字节[]传入,Int32计数,AsyncProtocolRequest as

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

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

生产环境使用三层体系结构,Web对话到应用程序,应用程序对话到数据库。Web和应用程序使用WCF服务层通过SSL(443)进行通信。我们认为这可能是IIS7中SSL证书中的配置或WCF配置问题

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

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

我尝试了以下建议:


此答案适用于客户端证书,其中您将使用有效负载向HTTPS端点发送证书

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

您是否可以转到系统上需要提供证书的简单网页(非WCF服务)? 即: 这将允许您在WCF之外测试证书,并允许您将WCF问题与IIS问题分开

1) 确保已在IIS中设置证书映射。

短tl;博士对于我们所做的:

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

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



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

您是否尝试过通过构建一个虚拟应用程序将问题降至最低形式,该应用程序的配置方式与实际应用程序相同,但仅实现一个
DoNothing()
操作(理想情况下,客户端只尝试调用该
DoNothing()
操作一次)?如果失败,您至少可以确保它位于基础架构中的某个位置,而不在实际业务代码中。此外,尝试从浏览器连接到端点,并查看它显示的内容(假设您遇到错误)@jeroenmoster对,我们实现了类似的操作并收到了相同的错误。我们注意到证书颁发给了不同的url,而不是localhost,应用程序和web都颁发给了*.some。some…web-to-app地址没有使用相同的颁发给:“…”web和应用层尚未向公众开放。这可能与您的服务行为有关,您的服务行为是什么样子的?是链信任还是对信任?您可以粘贴绑定和行为吗?请不要粘贴敏感值并放置虚拟值here@Bravo11实际上,我们没有在WCF中包含行为,我们只是使用了b使用安全模式=“传输”和clientCredentialType=“无”进行绑定。我想我读了一篇关于使用行为而不是上述绑定的帖子。这里:一个比另一个更好吗?我得到了解决方案,我将回顾我在这里写的所有内容和你的答案,看看是否匹配。我最终使用了wsHttpBinding。结果是,我不理解如何正确设置服务模型及其绑定各层之间的冲突。
<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>