如何通过 WCF 设置 SSL?

Vya*_*che 5 c# asp.net ssl wcf

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

根据验证程序,远程证书无效。
[AuthenticationException: 根据验证程序,远程证书无效。] System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception) +2755308
System.Net.Security.SslState.StartSendBlob(Byte[] coming) , Int32 计数, AsyncProtocolRequest asyncRequest) +470

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

我们尝试了什么:我将 App 和 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

“根据验证程序,远程证书无效。” 使用 Gmail SMTP 服务器

我怎么知道证书的 storeName 是什么?

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

具有相互 SSL(服务和客户端之间)的自托管 WCF 服务失败并显示 403 Forbidden

Rya*_*ier 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 -客户端证书映射身份验证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>
Run Code Online (Sandbox Code Playgroud)

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