gpt4 book ai didi

c# - 使用带有 C# REST API 和 SslStream 类的 cURL (PHP) 的 SSL/TLS 错误

转载 作者:太空宇宙 更新时间:2023-11-03 14:01:26 25 4
gpt4 key购买 nike

我用 C# 编写了一个 REST API 服务器,它使用 System.Net.Security.SslStream 类来提供 SSL/TLS 加密。

我还在创建一个 Web 服务,它使用 PHP + cURL 来处理与服务器的通信。

在本地,我使用 WAMP 作为测试环境,一切正常。

但是,在远程环境中上传和测试时,通信失败并显示以下错误消息:

cURL 错误

Unknown SSL protocol error in connection to mywebsite.example:443

SslStream 错误

SslStream.AuthenticateAsServer() 中的

AuthenticationException:

A call to SSPI failed, see inner exception.

Inner exception: The client and server cannot communicate, because they do not possess a common algorithm

尝试使用 TLS 1.2 身份验证时发生此异常和错误:

SslStream.AuthenticateAsServer(ServerCertificate, false, SslProtocols.Tls12, true);

我尝试设置各种 cURL 选项,例如:

    curl_setopt($curl, CURLOPT_SSLVERSION,CURL_SSLVERSION_TLSv1_2);

但是,唉,没有快乐。

检查 phpInfo() 配置的差异后,我注意到 SSPI 在本地的 cURL 设置中启用,但在远程服务器上没有:

cURL settings

我对SSPI知之甚少,其实大部分只是维基百科上总结的:

Security Support Provider Interface (SSPI) is a Win32 API used by Microsoft Windows systems to perform a variety of security-related operations such as authentication.

所以,这似乎是问题的原因 - 但是......

我通过将 SslProtocols 类型从 SslProtocols.Tls12 更改为 SslProtocols.Tls 成功实现了通信>。但是,据我所知,SSPI 不依赖于任何特定的 SSL 协议(protocol),那么为什么它起作用了?

目前这是一种解决方法,但我真的很想了解导致此问题的根本原因。任何人都可以阐明这里发生的事情吗?

我宁愿完全支持 TLS 1.2 而不必降级。

最佳答案

该问题实际上与 SSPI 无关。

SslProtocols.Tls 可能意味着:“自动协商任何合适的通用版本”,而 SslProtocols.Tls12 意味着:“强制 TLS 版本 1.2”

因此,如果您强制使用 TLS 1.2 但并非所有各方都知道此版本,则握手将失败。通过让他们自动协商,他们反而可能能够在 TLS 1.1 或 1.0 上收敛

请注意,现在除了 TLS 1.2 之外的任何东西都不是一个好主意,或者至少它应该是一个临时情况。此外,两周前 TLS 1.3 刚刚作为标准发布。

让系统自动协商版本通常会更好,这样当它们升级时,它们会落入当时可能的最高版本。因此,强制执行 SslProtocols.Tls12 即使它有效,在短期内(目前最好的 TLS 版本)也是好的,但从长远来看(如果您的两个系统都已升级并且能够支持 TLS 1.3)在将来,您不会从中获利,这很可悲,因为 1.3 在许多方面都优于 1.2。

但是,相反,让他们自动协商有一些缺点:

  1. 虽然主要是装饰性的,但在 OpenSSL 中用于进行自动协商的符号常量被误导为 SSLv23_METHOD(例如,您也有 TLSv1_2_METHOD),这确实 不是是指 SSL 2 或 SSL 3(现在应该已经过时的两个东西),而是“我们可以自动协商的最好的东西”(关于正确设计和使用 TLS API 的一般问题,特别是在网络之外,这是一个大开眼界论文:https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf )
  2. 更重要的是,如果您不观察正在发生的事情(日志记录),当您同时想要更好的东西时,您可能会让系统自动协商非常低的版本,如 TLS 1.0 或更糟糕的 SSL 3.0。因此,您可能有一个正在运行的系统,但没有达到您想要或需要的安全级别。

关于c# - 使用带有 C# REST API 和 SslStream 类的 cURL (PHP) 的 SSL/TLS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51976278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com