客户端和服务器无法通信,因为它们在 Windows Server 2008 Web 上不具备通用算法

The client and server cannot communicate, because they do not possess a common algorithm on Windows Server 2008 Web

我正在开发 ASP.Net WebForms 应用程序。我们正在使用 PayFort's Start API 进行付款流程。该应用程序在我们的本地计算机 (Windows 10) 上 运行 正常,但是当我们尝试在我们的部署服务器 (Windows 服务器上使用他们的 API 进行付款时,它显示以下错误网络 2008)。

The client and server cannot communicate, because they do not possess a common algorithm.

他们网页上的文档 (PayFort Start and SSL/TLS) 指出他们使用 Tls1.2 进行通信。他们的 API 已经包含使用 Tls1.2 作为安全协议的代码

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

我们在 .Net framework 4.5 上构建了应用程序,因为 Tls1.2 仅受 .Net 4.5 或更高版本支持。不用说,我们的服务器已经安装了 .Net Framework 4.5。

我们还在 windows registry

中添加了 Tls1.1 和 Tls1.2 的注册表值 使用 SSL Labs tool, we've also confirmed that there are atleast two Cipher suites supported by both servers (our server and PayFort's API Server) (https://api.start.payfort.com)

PayFort 的 API 服务器支持的密码套件 (绿色轮廓是我们服务器常见的那些)

我们的服务器支持的密码套件

我还使用了 Nartac IIS crypto software 并将以下信息显示为 Best Practices

我不确定它是否与问题有关,但这是我们服务器中安装的 SSL 证书的详细信息


任何人都可以指出我们做错了什么以及我们应该做什么才能与所需的服务器通信并从部署在我们服务器上的应用程序付款,就像我们在本地机器上做的一样完美。

我在 Payfort Start 团队工作。我们有一个页面 here 可以帮助更详细地描述这个问题。本质上,您的 API 客户端(您用来发出 HTTPS 请求的库)必须支持 TLS1.2。 Start API 将拒绝任何不支持至少 TLS1.2 的请求。

WebRequest 似乎支持 TLS 1.1 和 1.2,但您必须手动启用它们。您可以参考 this answer 进行修复。

要验证您的客户端是否支持 TLS1.2,您可以从您的应用程序向 https://www.howsmyssl.com/a/check 发送 GET 请求并读取响应。

在 cURL 中:

> curl -X GET https://www.howsmyssl.com/a/check

Returns:

{
  given_cipher_suites: [
    "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
    "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
    "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
    "TLS_RSA_WITH_AES_128_GCM_SHA256",
    "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
    "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
    "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
    "TLS_RSA_WITH_AES_256_CBC_SHA",
    "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
    "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
    "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
    "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
    "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
    "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
    "TLS_RSA_WITH_RC4_128_SHA",
    "TLS_RSA_WITH_RC4_128_MD5",
    "TLS_RSA_WITH_AES_128_CBC_SHA",
    "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
    "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
  ],
  ephemeral_keys_supported: true,
  session_ticket_supported: true,
  tls_compression_supported: false,
  unknown_cipher_suite_supported: false,
  beast_vuln: false,
  able_to_detect_n_minus_one_splitting: false,
  insecure_cipher_suites: {
    "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA": [
      "uses keys smaller than 128 bits in its encryption"
    ]
  },
  tls_version: "TLS 1.2",
  rating: "Bad"
}

注意最后的 tls_version

我希望这可以澄清你的情况并对你有所帮助:

1 确认应用在 .net 4.5(或更高版本)下 运行。

4.5+ 支持 TLS 1.2。要获得 .net 框架的实际版本,您的应用程序位于 运行 下:https://msdn.microsoft.com/en-us/library/system.environment.version(v=vs.110).aspx

2 在 Windows 注册表中启用 TLS 1.2。

我刚刚发现这个 link 对启用 TLS 1.2 很有用 The client and server cannot communicate, because they do not possess a common algorithm

问题出在操作系统上。我们使用的是 Windows Server 2008,我们没有意识到应用程序需要 OS 的协议才能与其他服务器通信。由于我们安装了 .NET Framework 4.5,并且我们还使用代码 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 强制应用程序使用 Tls1.2(根据要求),因此相信一切都应该正常工作,但显然这不是不会发生的。
tl;dr; 我们在机器上安装了 Windows Server 2012,应用程序现在 运行 正常(应该如此)