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

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

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

他们的网页上的文档( PayFort Start和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注册表中添加了Tls1.1和Tls1.2的注册表值

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

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

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

我还使用了Nartac IIS加密软件 ,它显示了以下信息作为Best Practices Nartac IIS加密细节

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

任何人都可以指出我们做错了什么,我们应该怎么做才能与所需的服务器进行通信,并从我们服务器上部署的应用程序付款,因为我们在本地机器上做得很好。

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

看起来WebRequest确实支持TLS 1.1和1.2,但您必须手动打开它们。 您可以参考此答案进行修复。

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

在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

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

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。

我刚刚发现此链接对启用TLS 1.2非常有用客户端和服务器无法通信,因为它们没有通用算法

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