我有两个 EDI 服务器,A 和 B。贸易伙伴使用 TLS 连接。
一个贸易伙伴无法连接到服务器 B,但可以连接到服务器 A。
问题显然是 A 上的密码套件与 B 上的密码套件不同。原因是 B 已应用 Windows 更新,但 A 未应用。
所以我想将更新之前原来存在的所有密码套件放回 B 上,以便它们是相同的。 这应该可以让合作伙伴成功连接。
我已经使用 SSLLabs 运行了一份有关密码套件的报告,这是 A 上的列表,但 B 上没有:
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x9e)
TLS_RSA_WITH_AES_256_GCM_SHA384 (0x9d) TLS_RSA_WITH_AES_128_GCM_SHA256 (0x9c)
TLS_RSA_WITH_RC4_128_MD5 (0x4)
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x9f)
如何启用/安装这些密码套件?
所以,插话有点晚了……好吧……真的晚了……但我有同样的问题,并找到了一些额外的信息来帮助扩展这篇文章。
正如已经说过的......显然不,你不能“添加/安装”额外的套件。但是...您可以更改哪些是活动的以及它们的首选顺序。所以,上面已经说过的是关于如何改变已经活动的顺序的链接......这很酷......但是,这只是我相信你寻求的答案的一部分。问题的另一半是“有什么可供选择?”为此,我想分享这个链接...
https://learn.microsoft.com/en-us/windows/win32/secauthn/cipher-suites-in-schannel
在该页面上,您应该找到更多“最新 Windows 操作系统”的链接列表(如果您想将 Windows XP 称为“最新”),并且每个后续链接将向您显示 1) 默认情况下启用的密码套件,2 ) 哪些密码套件可用,但默认情况下处于禁用状态,以及 3) 哪些预共享密钥套件可根据要求提供。在这三个列表之间,您可以选择要加载的密码套件以及加载顺序。
现在...棘手的部分...我无法弄清楚的部分...显然,操作系统可用的密码套件的完整列表可以通过 Microsoft 认为适合传递的各种 Windows 更新进行更新对我们来说。我不清楚在完全修补/更新后在哪里可以找到可用套件的完整列表。我在这一点上可能是错的,但我查过的地方似乎暗示了这样的事情。无论如何...我希望有一些命令行/PowerShell 方式来查看可供选择的可用套件的完整列表。我能找到的最好的方法是“Get-TlsCipherSuite”...它似乎只向您显示当前启用的套件列表中的内容...而不是可供选择的可用套件的完整列表。如果有人知道要输入的魔法词才能获得完整列表...这就是我感兴趣的。;)
无论如何......聚会迟到了......但希望这个金块可以帮助其他人完成同样的任务。 :)
此 C 函数枚举密码套件:
#include <windows.h>
#include <stdio.h>
#include <Bcrypt.h>
#ifndef NT_SUCCESS
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#endif
int main()
{
NTSTATUS status;
ULONG uSize = 0;
PCRYPT_CONTEXTS pContexts = NULL;
// Get the contexts for the local machine.
// CNG will allocate the memory for us.
status = BCryptEnumContexts(CRYPT_LOCAL, &uSize, &pContexts);
if (NT_SUCCESS(status))
{
// Enumerate the context identifiers.
for (ULONG uContextIndex = 0;
uContextIndex < pContexts->cContexts;
uContextIndex++)
{
wprintf(L"\nContext [ %s ]:\n",
pContexts->rgpszContexts[uContextIndex]);
// Get the functions for this context.
// CNG will allocate the memory for us.
PCRYPT_CONTEXT_FUNCTIONS pContextFunctions = NULL;
status = BCryptEnumContextFunctions(
CRYPT_LOCAL,
pContexts->rgpszContexts[uContextIndex],
NCRYPT_SCHANNEL_INTERFACE,
&uSize,
&pContextFunctions);
if (NT_SUCCESS(status))
{
// Enumerate the functions.
for (ULONG i = 0;
i < pContextFunctions->cFunctions;
i++)
{
wprintf(L"\t%s\n",
pContextFunctions->rgpszFunctions[i]);
}
// Free the context functions buffer.
BCryptFreeBuffer(pContextFunctions);
}
}
// Free the contexts buffer.
BCryptFreeBuffer(pContexts);
}
return status;
}