客户端和服务器无法通信,因为它们在Windows Server 2008 Web上没有共同的算法。

6
我正在开发一个ASP.Net WebForms应用程序。我们正在使用PayFort的Start API进行支付处理。该应用程序在我们的本地机器(Windows 10)上运行良好,但当我们尝试在部署服务器(Windows Server Web 2008)上使用他们的API进行付款时,会出现以下错误。

客户端和服务器无法通信,因为它们没有共同的算法。

他们网页上的文档(PayFort Start and SSL/TLS)说明他们使用Tls1.2进行通信。他们的API已经包含了使用Tls1.2作为安全协议的代码。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

我们使用了.Net框架4.5构建应用程序,因为只有.Net 4.5或更高版本支持Tls1.2。需要提到的是,我们的服务器已经安装了.Net Framework 4.5。

我们还在Windows注册表中添加了Tls1.1和Tls1.2的注册表值。

使用SSL Labs工具,我们还确认了至少有两个密码套件被两个服务器(我们的服务器和PayFort的API服务器)支持(https://api.start.payfort.com)。

PayFort的API服务器支持的密码套件 Cipher suites supported by PayFort's API Server (绿色轮廓是与我们的服务器相同的)

我们的服务器支持的密码套件 Cipher Suites supported by our server

我还使用了Nartac IIS crypto软件,它显示以下信息作为最佳实践 Nartac IIS crypto details

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

请问有人能指出我们做错了什么,以及我们应该怎么做才能与所需的服务器通信并从部署在我们服务器上的应用程序进行付款,就像我们在本地机器上做的那样。
3个回答

2
我是Payfort Start团队的助手。我们有一个页面在这里,可以更详细地描述此问题。基本上,您的API客户端(用于进行HTTPS请求的库)必须支持TLS1.2。Start API将拒绝任何不支持至少TLS1.2的请求。
看起来WebRequest确实支持TLS 1.1和1.2,但您必须手动启用它们。您可以参考这个答案进行修复。 要验证您的客户端是否支持TLS1.2,您可以从应用程序向https://www.howsmyssl.com/a/check发送GET请求并读取响应。
在cURL中:
> curl -X GET https://www.howsmyssl.com/a/check

返回:

{
  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

我尝试从我的应用程序发送GET请求,但默认显示tls_version 1.0。然而,当我尝试通过编写ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12来更改代码中的协议时,应用程序会崩溃,并显示相同的错误“客户端和服务器无法通信...”。请检查此处的demo,并分别单击Get RequestGet Request Tls1.2按钮。 - sohaiby
我也使用了Nartac IIS加密软件,它显示出这些信息作为最佳实践。 - sohaiby

2
问题出在操作系统上。我们使用的是Windows Server 2008,但没有意识到应用程序需要操作系统的协议来与其他服务器通信。由于我们安装了.NET Framework 4.5,并且还使用了代码 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 来强制应用程序使用 Tls1.2(根据要求),因此认为一切应该正常工作,但显然情况并非如此。
简而言之; 我们在机器上安装了Windows Server 2012,现在应用程序正在正常运行(应该如此)。

我们曾经认为,由于最新的浏览器支持Tls1.2,即使在旧操作系统(如Windows Server 2008或更早版本)上运行,我们的应用程序也应该能够在Windows Server 2008操作系统上运行,只要我们强制其使用Tls1.2。因此,我们没有专注于升级操作系统,结果陷入了困境! - sohaiby
您的意思是说,Windows 2008的Web服务器不支持Tls1.2。我正在寻找Payfort作为支付网关,但我们的Web服务器安装了Windows 2008和.Net框架,这是否可行,或者我们需要像您在答案中提到的那样使用Windows 2012? - Learning
@学习 是的,那正是我所指的。我们在遇到该问题时正在使用 Windows Server 2008,需要升级到 Server 2012 才能解决问题。 - sohaiby
感谢您的回复。我们还有Windows 2008服务器,我担心它无法使用Payfort支付网关。在他们的文档中,我找不到好的ASP.NET WebForm集成示例,当我联系他们时,他们会引用Start.net库,但我对此不太熟悉,而且他们甚至没有为.NET集成提供自由职业者。 - Learning

1

该应用程序正在运行在 .Net Framework 4.5 上。您可以通过单击“获取请求”按钮来检查演示应用程序,它会显示 Environment.Version。此外,我已经在 Windows 注册表中启用了 Tls1.2,请参见此处的快照 - sohaiby
我还使用了Nartac IIS加密软件,并且它显示出这些信息作为最佳实践。 - sohaiby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接