远程证书无效错误在调用ServerCertificateValidationCallback之前

时间:2015-12-17 22:30:20

标签: c# c#-4.0 x509certificate soap-client ws-security

尝试连接到SOAP 1.1服务器时出现异常。我收到了来自其他组织的WSDL,并使用.net将其作为服务参考提供给我的项目。

我们需要使用包含MTOM附件和HTTP gzip压缩。它还需要使用X.509身份验证框架的Web服务安全性(WS-Security)1.0版(使用OASIS标准)来实现端到端安全性。

我正在使用4.5.2 .Net框架在c#中工作。

以下是我的app.config的相关部分,其中包含可能敏感的信息:

  <basicHttpBinding>
    <binding name="customHttpBinding" allowCookies="true" messageEncoding="Mtom">
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Certificate" />
        <message clientCredentialType="Certificate" />
      </security>
    </binding>
  </basicHttpBinding>

[snip]

<client>
  <endpoint address="YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
    binding="basicHttpBinding" bindingConfiguration="customHttpBinding"
    contract="SERVICENAME.BulkRequestTransmitterPortType"
    name="BulkRequestTransmitterPort">
    <identity>
      <certificateReference storeLocation="CurrentUser" x509FindType="FindBySerialNumber"
        findValue="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />
    </identity>
  </endpoint>
</client>

Xs是我的密钥的序列号(确认在我的计算机商店中),Y是端点

以下是我创建和调用服务的部分(Xs是相同的证书):

  var transmitter = new BulkRequestTransmitterPortTypeClient();

  transmitter.ClientCredentials?.ClientCertificate.SetCertificate(
      StoreLocation.CurrentUser, 
      StoreName.My, 
      X509FindType.FindBySerialNumber, 
      "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

  var response = transmitter.BulkRequestTransmitter(
      securityHeader, 
      security, 
      ref businessHeader, 
      transmitterManifestReqDtl, 
      transmitterType);

它在最后一行爆炸,出现以下错误:

ex  {"Could not establish trust relationship for the SSL/TLS secure channel with authority 'YYYYYYYYYYYY'."}    System.Exception {System.ServiceModel.Security.SecurityNegotiationException}
    +InnerException {"The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel."}    System.Exception {System.Net.WebException}
        +InnerException {"The remote certificate is invalid according to the validation procedure."}    System.Exception {System.Security.Authentication.AuthenticationException}

每当我进行搜索时,我发现了两个建议,第一个是确保服务器证书在我的受信任存储区中,并且第三方权限是受信任的。我已经确认两者都在我当地的电脑商店并且值得信赖。第二个也是最常见的建议是覆盖ServicePointManager.ServerCertificateValidationCallback,返回true如下:

ServicePointManager.ServerCertificateValidationCallback = delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
};

我在尝试这个时犹豫不决(我不喜欢在开发环境中使用不良做法)我认为在调试中使用是值得的。可悲的是,断点从未命中。我收到错误之前 ServerCertificateValidationCallback触发。

我现在不知所措。我不确定我做错了什么,因为我对配置所做的每一次更改都会在更早的时候产生错误,所以我认为我正走在正确的道路上,但我不确定为什么验证过程失败以及如何解决它。我将不胜感激,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是因为有问题的服务器没有使用证书。如果您通知.net期望服务器中的一个,则在获取ServerCertificateValidationCallback之前,它会失败并显示此错误消息。

相关问题