身份验证失败,因为远程方已关闭传输流


86

我正在开发一个TCP客户端,以使用证书身份验证连接OpenSSL服务器。我使用服务器团队共享的.crt和.key文件。这些证书由OpenSSL命令生成。

我使用的SslStream对象调用来验证TCP客户端SslStream.AuthenticateAsClient通过将服务器的方法IPSslProtocols.Ssl3X509CertificateCollection

我收到以下错误:

验证失败,因为远程方已关闭传输流


2
在后POODLE时代,这似乎是一个问题:SslProtocols.Ssl3。也许你应该尝试一下SslProtocols.Tls。在.Net 4.5及更高版本中,您也可以使用Tls11Tls12。请参阅SslProtocols枚举。您可能还有其他问题。
jww 2015年


谢谢。我的问题是通过从证书和密码的物理路径附加证书而不是从Windows证书存储区搜索证书使用者名称来解决的。
Odelu 2015年

现在,我可以从所有SslProtocols(SSL3,Tls1和Tls2)中获取结果。感谢您的回复
Odelu 2015年

@Odelu,您如何解决此问题?在客户端还是服务器端?

Answers:


155

我建议不要将SecurityProtocol限制为TLS 1.1。

推荐的解决方案是使用

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls

另一个选择是添加以下注册表项:

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto 

值得注意的是,.NET 4.6默认情况下将使用正确的协议,并且不需要任何一种解决方案。


6
哇,您刚刚解决了我的问题-我正在尝试各种方法-然后最终在这里看到了框架说明。刚将其切换为4.6.1(使用4.5),希望问题出在框架可能使用了错误的安全协议-宾果游戏,我的连接没有被拒绝,我正在获取数据!
Veverke '16

7
重要的是要说System.Net.ServicePointManager.SecurityProtocol = ...必须在创建请求之前执行。
Tonatio

2
目标框架版本更新到4.6.1挽救了我的生命:-)
Awais

我的框架设置为4.6.2。也许我不得不改用TLS解决方案
-Luminous

我正在使用4.7.2 Framework,但我正在发送请求的站点正在使用TLS 1.2,但就像来自10的6个请求一样,我收到此错误。有任何想法吗 ?
Davit Mikuchadze

16

如果要使用旧版本的.net,请创建自己的标志并将其强制转换。

    //
    // Summary:
    //     Specifies the security protocols that are supported by the Schannel security
    //     package.
    [Flags]
    private enum MySecurityProtocolType
    {
        //
        // Summary:
        //     Specifies the Secure Socket Layer (SSL) 3.0 security protocol.
        Ssl3 = 48,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.0 security protocol.
        Tls = 192,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.1 security protocol.
        Tls11 = 768,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.2 security protocol.
        Tls12 = 3072
    }
    public Session()
    {
        System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(MySecurityProtocolType.Tls12 | MySecurityProtocolType.Tls11 | MySecurityProtocolType.Tls);
    }

1
你没有使用你自己的类,你可以直接投整数SecurityProtocolTypeServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
燕F.

13

添加以下代码可以帮助我解决该问题。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;

8
using (var client = new HttpClient(handler))
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiEndPoint)).ConfigureAwait(false);
                await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            }

这对我有用


1
关键位是以下行:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 尽管这个答案很好,因为它显示了该行应适合典型用例的位置。
尼克画家

5

使用ChargifyNET.dll与Chargify API通信时,我遇到了相同的错误消息。添加chargify.ProtocolType = SecurityProtocolType.Tls12;到配置为我解决了这个问题。

这是完整的代码片段:

public ChargifyConnect GetChargifyConnect()
{
    var chargify = new ChargifyConnect();
    chargify.apiKey = ConfigurationManager.AppSettings["Chargify.apiKey"];
    chargify.Password = ConfigurationManager.AppSettings["Chargify.apiPassword"];
    chargify.URL = ConfigurationManager.AppSettings["Chargify.url"];

    // Without this an error will be thrown.
    chargify.ProtocolType = SecurityProtocolType.Tls12;

    return chargify;
}

2

对于VB.NET,可以在Web请求之前放置以下内容:

Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols)
Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType)
ServicePointManager.SecurityProtocol = Tls12

这解决了我在.NET 3.5上的安全性问题。


0

当Web请求端点切换到仅接受TLS1.2请求的另一台服务器时,这发生在我身上。尝试了很多尝试,这些尝试主要在Stackoverflow上找到,例如

  1. 注册表项
  2. 添加:
    System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; 到Global.ASX OnStart,
  3. 在Web.config中添加。
  4. 将.Net框架更新为4.7.2仍会出现相同的异常。

收到的例外情况并不能使我所面对的实际问题变得公道,并没有获得服务运营商的帮助。

为了解决这个问题,我必须添加一个新的Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 我从这里开始使用IIS Crypto 2.0 Tool,如下所示。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.