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

ffx8fchx  于 2022-12-24  发布在  .NET
关注(0)|答案(9)|浏览(275)

我正在开发一个TCP客户端来连接OpenSSL服务器和证书认证。我使用了服务器团队共享的. crt和. key文件。这些证书是由OpenSSL命令生成的。
我使用SslStream对象通过调用SslStream.AuthenticateAsClient方法验证Tcp客户端,方法是传递服务器IPSslProtocols.Ssl3X509CertificateCollection
我收到以下错误:
身份验证失败,因为远程方已关闭传输流

oxcyiej7

oxcyiej71#

我建议不要将安全协议限制为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将默认使用正确的协议,并且不需要任何一种解决方案。

ojsjcaue

ojsjcaue2#

如果您想使用较旧版本的.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);
    }
v440hwme

v440hwme3#

添加下面的代码帮助我克服了这个问题。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
xe55xuns

xe55xuns4#

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

这对我很有效

1szpjjfi

1szpjjfi5#

我在使用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;
}
jljoyd4f

jljoyd4f6#

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

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

这解决了我在.NET3.5上的安全问题。

3b6akqbq

3b6akqbq7#

当一个web请求端点被切换到另一个只接受TLS1.2请求的服务器时,我就遇到了这种情况。尝试了很多次,大多数都是在Stackoverflow上找到的,比如
1.注册表项,
1.增加:
System.Net.ServicePointManager.SecurityProtocol| =系统.网络.安全协议类型. Tls12;到环球. ASX OnStart
1.在Web.config中添加。
1.已将. Net框架更新至4.7.2,但仍出现相同的异常。
收到的例外没有公正地对待我所面临的实际问题,也没有从服务运营商那里找到任何帮助。
要解决这个问题,我必须添加一个新的密码套件TLS_DHE_RSA_WITH_AES_256_GCM_SHA384我使用了here中的IIS Crypto 2.0工具,如下所示。

xiozqbni

xiozqbni8#

我在VS 2019中遇到了以下问题:

  • 唱在不工作
  • 扩展-〉管理扩展-〉无法检索扩展信息。

我已经添加了一个新的密码套件TLS_DHE_RSA_WITH_AES_256_GCM_SHA384作为FunMatters的解释。这也解决了我的问题。

lf5gs5x2

lf5gs5x29#

在.NET框架4.8我添加了以下代码之前发送请求.

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

相关问题