WCF客户端。客户证书。第一次通话成功,第二次通话失败

时间:2019-06-04 19:22:25

标签: c# wcf network-programming ssl-certificate

我正在尝试使用c#.NET 4.5通过soap11和客户端证书凭据通过https连接到soap Web服务。我使用vs工具添加服务引用,并为我创建了一个肥皂客户端。

我创建了一个customBinding来通过soap11完成https:

App.config

<system.serviceModel>
    <bindings>
      <customBinding>
        <binding name="*****" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:05:00" sendTimeout="00:05:00">
          <textMessageEncoding messageVersion="Soap11"/>
          <httpsTransport useDefaultWebProxy="false" requireClientCertificate="true" allowCookies="false" />
        </binding>
      </customBinding>
    </bindings>
    <client>
        <endpoint address="******************"
            behaviorConfiguration="******************"
            binding="customBinding" bindingConfiguration="******************"
            contract="******************"
            name="******************" />
    </client>
  <behaviors>
    <endpointBehaviors>
      <behavior name="******************">
        <clientCredentials>
          <clientCertificate findValue="******************" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
        </clientCredentials>
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>

c#代码:

     var client = new IConsultService.ConsultServiceClient();
     client.consult("1"); 
     client.consult("1"); <!-- fail error 404 - there was not endpoint listening at

如果我在未发送证书的情况下收到tomcat 404,则如果我第一次发送客户端证书就可以,并且在我看来,我已被重定向。问题在于,在第二个请求失败(404)时,如果我实例化客户端,该请求也会再次失败。仅在停止应用程序并重新启动时才能再次工作。似乎某些内容已缓存在程序的静态堆栈中。

由于是404,我的猜测是来自客户端证书,如果我请求不提供证书,则错误是相同的。

我尝试以编程方式创建绑定,设置ClientBase.CacheSetting = CacheSetting.AlwaysOff时不走运。

编辑1: 使用System.Net.HttpWebRequest的过程相同,第一个请求确定,第二个请求404。

Edit2: 握手时似乎有一些请求发送“证书,客户端密钥交换”,第二个请求“更改密码密钥交换”

是否有一种方法可以强制关闭渠道并始终发送“证书,客户密钥交换”?

enter image description here enter image description here

谢谢

1 个答案:

答案 0 :(得分:0)

首先,如果我们使用X509证书对客户端进行身份验证,通常需要在服务器和客户端之间建立信任关系,即,我们应该在受信任的根证书颁发机构中安装彼此的证书,并且客户端需要提供一个用于确认服务器身份的身份(通常是服务器证书的公钥或主机名)

<endpoint address="net.tcp://10.157.13.69:4386/" binding="netTcpBinding"
    bindingConfiguration="NetTcpBinding_ITestService" contract="ServiceReference1.ITestService"
    name="NetTcpBinding_ITestService">
    <identity>
        <dns value="vabqia969VM" />
    </identity>
</endpoint>

第二,我怀疑问题是由TLS版本引起的。您是否尝试升级这些项目的Dotnetframework?至少4.6.2以上。请参考以下文档。
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
随时让我知道问题是否仍然存在。