【问题标题】:No client certificate was presented during SSL HandshakeSSL 握手期间未提供客户端证书
【发布时间】:2016-06-15 05:06:07
【问题描述】:

我想请求解释。我正在使用X.509 certificate,当我尝试将我的数据发布到我想与之通信的webservice 时,我收到以下错误:“

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

你能解释一下是什么问题吗?

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

我所做的是:首先我将证书导入商店,然后使用下面的代码找到它,然后接收令牌(使用 AskForToken 函数)。但是,当我发送数据时,握手失败。

我的第一个问题是为什么我成功获取token(如果我没记错的话,客户端(也就是我的应用程序)将证书发送到服务器并拿到了token,说明连接已经做好了)?

我的第二个问题,我必须更改或检查什么才能摆脱握手失败。

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;
        }

【问题讨论】:

    标签: c# ssl certificate x509 handshake


    【解决方案1】:

    SSL 有可能要求客户端身份验证。因此,客户端(您的应用程序)必须在建立连接之前发送服务器信任的证书。似乎此客户端身份验证失败,因为您的应用程序没有发送这样的证书。

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

    【讨论】:

    • 感谢@DerKasper 的回答,正如您在我发送证书的代码中所见。任何想法可能是什么问题。谢谢
    • @R.You:我不知道 ChannelFactory 是如何工作的,也不知道 ssl 是如何工作的,但我的方法是: - 首先检查是否不仅您的代码发送证书,但它真的从您的 PC 发送。使用 Wireshark(带有 ssl 过滤器),您应该找到来自服务器的带有证书请求的消息,并且应该找到发送证书的客户端。如果发送了证书,则问题不在应用程序中,而是在服务器中,服务器拒绝了您的证书。必须更改服务器,以便他接受您的证书。您可以从任何应用程序连接到该服务器吗?
    • 谢谢@DerKasper,很遗憾我无法从任何应用程序连接到服务器。我按照您的建议使用了 Wireshark,它捕获了如下一系列交换:1) Client Hello 2) Server Hello 3) Certification 4) Certificate Request, Server Hello Done 5) 证书、客户端密钥交换、更改密码规范、加密握手消息 6) 更改密码规范、加密握手消息。你能解释一下这是什么意思吗?它有助于解决我的问题吗?
    • 这意味着 SSL 握手已正确完成并且您的代码似乎工作正常。问题是:服务器不信任您/拒绝您的应用程序证书。您无权使用网络服务(客户端身份验证保护每个人都可以使用的服务)。如果您无权访问服务器(将您的证书添加到受信任的证书列表中)或服务器接受的任何客户端证书,您将无法建立连接。抱歉,您似乎尝试使用不允许使用的服务,并且无法解决您的问题。
    • 感谢@DerKasper 的帮助,现在已经解决了...问题出在服务器端,我不知道他们在他们这边做了什么改变,这就是为什么我无法确认是什么问题确实存在,但我认为正如你所说,他们刚刚授权了我的证书。
    【解决方案2】:

    在 SSL 握手期间,客户端将其公钥提供给另一方,这显然没有发生。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 2016-01-18
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多