运行在IIS中的WCF服务无法连接到Web服务

3
我有一个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. 从控制面板 -> Internet属性 -> 内容 -> 证书导入证书。如果您以这种方式安装,它会显示安装成功,但不会出现在winhttpcertcfg中。 2. 通过启动 -> 运行 -> 键入“certmgr.msc”并通过此处进行安装来导入证书。它会说已成功导入,但证书对winhttpcertcfg不可用。 3. 通过启动 -> 运行 -> MMC并使用证书插件导入证书确实有效。单击此处以查看Windows XP的说明。
具体而言,以下内容有效:
  1. 开始 -> 运行 -> MMC
  2. 文件 -> 添加/删除管理单元
  3. 点击添加...
  4. 选择证书并点击添加
  5. 选择计算机帐户并点击下一步
  6. 选择本地计算机并点击完成
  7. 点击关闭
  8. 从控制台根目录导入证书到以下位置:

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

1
“local”指的是本地计算机上的“local” IIS实例(即您正在开发的同一台计算机),还是指“local”到您的网络等。 - KP.
客户端设置是什么? - Thomas Bates
感谢您发布最终解决方案! :) - Thomas Bates
1个回答

2
尝试在服务的 web.config 中启用跟踪。通过将 switchValue 设置为 Verbose,您可能能够找到更详细的错误信息。也许证书有问题。 配置和启用跟踪 您还可以尝试将服务证书验证模式设置为 none。 X509ServiceCertificateAuthentication.CertificateValidationMode 属性 另一个选项是将 Rapid SSL CA 导入到本地计算机的 Trusted Root Certification Authorities 中。我怀疑 cassini 没有进行证书验证或忽略了证书。
另一个可能存在的问题是,运行服务的 IIS 账户可能没有从证书存储中读取的权限。

1
我尝试将其添加到受信任的根证书颁发机构存储区,但没有帮助。我会怪罪内部代理服务器,但在通过Cassini运行时它是有效的。我确实尝试打开跟踪,但它只记录了相同的错误,没有新的信息。 - Phil Patterson
你在哪个操作系统上运行这个程序? - Thomas Bates
1
XP。看起来这是证书未正确安装的问题。当我从命令行运行winhttpcertcfg -l -c LOCAL_MACHINE\Root -s "RapidSSL CA"时,会出现错误“错误:无法找到或获取所请求证书的上下文”。当我为父证书问题运行此命令时,它返回“匹配证书: CN=GeoTrust Global CA O=GeoTrust Inc. C=US错误:无法成功获取私钥的访问权限。 只有安装证书的用户才能执行此操作。”看起来这是XP和错误安装证书的问题。 - Phil Patterson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接