SSL握手期间未提供客户端证书

问题描述:

我想问一下解释。我使用X.509 certificate,当我试图在我的数据发布到一个webservice,我想,我收到以下错误沟通:“SSL握手期间未提供客户端证书

No client certificate was presented during SSL Handshake

可以请您给我解释一下什么是问题

注:我使用.NET Framework 3.5/C#

我所做的恰恰是:首先,我将证书导入到店,然后我用下面的代码,以便找到它,然后收到(使用AskForToken功能)令牌不过。 ,当我发送我的数据时,我得到了握手失败。

我的第一个问题是为什么我成功获得令牌(如果我没有弄错,客户端(这是我的应用程序)将证书发送到服务器并获得令牌,这意味着连接已完成)?

我的第二个问题,我必须改变或检查以摆脱这种握手失败。

private static string RequestSecurityToken() 
     { 
      WSTrustChannelFactory trustChannelFactory = new Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannelFactory(
         new CertificateWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
         new EndpointAddress(new Uri(stsAddress))); 

      trustChannelFactory.TrustVersion = TrustVersion.WSTrust13; 

      string thumb = "fe14593dd66b2406c5269d742d04b6e1ab03adb1"; 
      trustChannelFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindByThumbprint, thumb); 
      trustChannelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust; 
      cert = trustChannelFactory.Credentials.ClientCertificate.Certificate; 

      var tokenString = AskForToken(serviceURL, trustChannelFactory); 
      trustChannelFactory.Close(); 
      return tokenString; 
     } 

SSL有可能要求客户端验证。因此,客户端(您的应用程序)必须在连接建立之前发送服务器信任的证书。看起来这个客户端认证失败了,因为你的应用程序不会发送这样的证书。

根据您尝试使用的网络服务,不可能创建这样的证书,因为服务器只信任来自例如应用程序的应用程序。某个公司。

+0

谢谢@DerKasper的回答,您可以在我发送证书的代码中看到。任何想法可能是什么问题。 谢谢 –

+0

@ R.You:我不知道ChannelFactory的工作方式,只是ssl如何工作,但我的方法是: - 首先检查您的代码是否不仅发送证书,而且是真正从您的PC。使用Wireshark(对于ssl使用过滤器),因为您应该使用证书请求从服务器中找到消息,并应找到客户端发送证书。 如果发送证书,则问题不在应用程序中,而在服务器中,该服务器拒绝您的证书。服务器将不得不被改变,以便他接受你的证书。你能从任何应用程序连接到服务器吗? – DerKasper

+0

谢谢@DerKasper,不幸的是我无法从任何应用程序连接到服务器。 我使用Wireshark的,你建议报告,并逮住交流的顺序如下: 1)_ **客户你好** _ 2)_ **服务器你好** _ 3)_ **认证** _ 4)_ **证书请求,服务器问候完成** _ 5)_ **证书,客户端密钥交换,变更密码说明,加密握手消息** _ 6)_ **更改密码规范,加密的握手消息** _。 你能解释一下这是什么意思?它有助于解决我的问题吗? –

在SSL握手过程中,客户端将其公钥显示给另一方,显然没有发生。

我不是C#程序员,所以无法提供代码。但是您需要创建一个SSL密钥对(私钥+公钥对)并使用它来定义您的SSL套接字等。