【问题标题】:WCF Service unable to connect to web service when running in IIS在 IIS 中运行时,WCF 服务无法连接到 Web 服务
【发布时间】:2012-07-17 17:20:18
【问题描述】:

我有一个 WCF 服务,它被用作我们正在集成的第三方 asmx 服务的包装器。它正在与之通信的服务是使用 Visual Studio 中的“添加服务引用”对话框添加的。 WCF 服务中的代码在单元测试中执行时有效,并且在调试主机应用程序时也有效。

当调试主机在 ASP.NET 开发服务器中运行时,它可以正常工作。当我将应用程序部署到本地 IIS 实例(与开发机器相同,IIS 5.1)时,服务将启动并运行,但在连接第三方 asmx 端点时会抛出此错误:

System.ServiceModel.Security.SecurityNegotiationException: 
Could not establish trust relationship for the SSL/TLS secure channel with
authority 'xxxxx.thirdparty.com'. ---> System.Net.WebException: The underlying
connection was closed: Could not establish trust relationship for the SSL/TLS
secure channel. ---> System.Security.Authentication.AuthenticationException: 
The remote certificate is invalid according to the validation procedure.

这些是服务端点配置文件中的设置:

<basicHttpBinding>
  <binding name="ServiceSoap" 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="false" proxyAddress="http://[internalWebProxyHere]">
    <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>

该服务在 Visual Studio 中有效,但在部署到 IIS 后无效。如何调试 AuthenticationExceptions?

编辑:客户端端点如下所示:

<endpoint address="https://'xxxxx.thirdparty.com/thirdpartyendpoint.asmx" 
    binding="basicHttpBinding" bindingConfiguration="ServiceSoap" 
    contract="eContracting.ServiceSoap" name="ServiceSoap"
    behaviorConfiguration="Behavior"/>

我尝试添加一个端点行为来禁用证书验证,但这没有帮助:

<behavior name="Behavior">
  <clientCredentials>
    <serviceCertificate>
      <authentication certificateValidationMode="None"/>
     </serviceCertificate>
    </clientCredentials>
</behavior>

如果第三方证书由 Rapid SSL CA 颁发,则该证书有效。在我的本地证书存储中查找此证书位于“中间证书颁发机构”选项卡中,但不在“受信任的根证书颁发机构”或“受信任的发布者”中。

编辑:通过将证书添加到“受信任的根证书颁发机构”解决了这个问题,尽管有一个问题。

  1. 从控制面板导入证书 -> InternetProperties -> 内容 -> 证书。如果您以这种方式安装,则表示安装成功,但不会显示在 winhttpcertcfg 中。
  2. 通过开始导入证书 -> 运行 -> 键入“certmgr.msc”并通过此处安装。会提示导入成功,但 winhttpcertcfg 无法使用证书。
  3. 通过开始 -> 运行 -> MMC 导入证书并使用证书管理单元确实有效。点击 here 查看 Windows XP 的说明。

具体来说,这是有效的:

  1. 开始 -> 运行 -> MMC
  2. 文件 -> 添加/删除管理单元
  3. 点击添加...
  4. 选择证书并单击添加
  5. 选择计算机帐户并单击下一步
  6. 选择本地计算机并单击完成
  7. 点击关闭
  8. 将证书从控制台根目录导入到这些位置:

    • 受信任的根证书颁发机构
    • 中级证书颁发机构
    • 第三方根证书颁发机构

【问题讨论】:

  • 是本地计算机上的“本地”IIS 实例(您正在开发的同一台计算机)还是您的网络的“本地”等。
  • 客户端设置是什么?
  • 感谢您发布最终解决方案! :)

标签: .net wcf web-services ssl iis-5


【解决方案1】:

尝试在服务 web.config 中启用跟踪。通过将 switchValue 设置为 Verbose,您可能会发现更详细的错误。可能证书有问题。

Configure and Enable Tracing

您也可以尝试将服务证书验证模式设置为无。

X509ServiceCertificateAuthentication.CertificateValidationMode Property

另一种选择是将 Rapid SSL CA 导入本地计算机上的受信任的根证书颁发机构。我怀疑 cassini 没有验证或忽略证书。

另一个可能的问题是,为您的服务运行 IIS 的帐户可能没有从证书存储区读取的权限。

【讨论】:

  • 我尝试添加到受信任的根证书颁发机构商店,但没有帮助。我会在这里责怪内部代理服务器,除非它在通过 Cassini 运行时工作。我确实尝试打开跟踪,但它只是记录了同样的错误,没有新信息。
  • 你在什么操作系统上运行这个?
  • XP。似乎是证书未正确安装的问题。当我从命令行运行 winhttpcertcfg -l -c LOCAL_MACHINE\Root -s "RapidSSL CA" 时,出现错误“错误:无法找到或获取所请求证书的上下文”。当我针对父证书问题运行此命令时,它返回“匹配证书:CN=GeoTrust Global CA O=GeoTrust Inc. C=US 错误:未成功获得私钥的访问权限。这只能由以下用户完成安装了证书。”似乎是 XP 的问题和错误安装的证书。
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
相关资源
最近更新 更多