C#SSL例程:tls_post_process_client_hello:没有共享密码



当我使用这个关于TlsCipherSuite的代码块时,我会得到这个错误"SSL例程:tls_post_process_client_hello:no shared cipher"。你能给点建议吗?

public static KestrelServerOptions ListenSera(this KestrelServerOptions options, SeraSettings seraSettings)
{
options.Listen(IPAddress.Parse(seraSettings.ListenIP), seraSettings.Port, listenOptions =>
{
listenOptions.UseConnectionLimits(veraSettings.ConnectionLimit);
listenOptions.UseHttps(adapterOptions =>
{
adapterOptions.OnAuthenticate = (context, authenticationOptions) =>
{
authenticationOptions.CipherSuitesPolicy = new CipherSuitesPolicy(new[]
{
TlsCipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
});
};
adapterOptions.SslProtocols = SslProtocols.Tls12;
adapterOptions.CheckCertificateRevocation = false;
adapterOptions.HandshakeTimeout = TimeSpan.FromSeconds(veraSettings.TlsHandshakeTimeout);
adapterOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
adapterOptions.ServerCertificate =
new X509Certificate2(Path.Combine("certs", veraSettings.ServerCertificateFilename),
veraSettings.ServerCertificatePassword);
adapterOptions.AllowAnyClientCertificate();
});
listenOptions.UseConnectionLogging();
listenOptions.UseConnectionHandler<VeraKecManager>();
});
return options;
}
}

这意味着您提供给服务器的密码在服务器中不可用。不知什么原因,你只提供了这两个密码:

TlsCipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,

第一种是使用普通的DHE,即密钥交换,它很慢,因此通常在服务器中不启用(服务器上的负载太大(。在第二个密码中,您提供ECDHE作为密钥交换,这要快得多,而且通常可用。但您只提供与ECDSA相关的证书,这意味着服务器需要ECC证书,而不是更常见的RSA证书。

一般来说,将提供的密码从默认密码更改为默认密码不是一个好主意。如果因为你无法解释的原因而将这些限制在少数几个,情况会更糟。一般来说,在不了解安全设置的实际作用以及更改的含义的情况下,您永远不应该更改这些设置,因为这不仅可能使您的代码无法工作,而且可能实际工作,但方式不安全。因此,如果默认设置还不够,最好将任何安全设置保留为默认设置,只更改这些设置。

我想您还可以做一些事情来诊断这个问题。

  1. 尝试运行Wireshark并侦听TLS握手数据包。如果仔细查看,您应该会看到客户端和服务器提供了哪些密码套件。

  2. 如果使用的是windows,请检查注册表(Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\LOCAL\SSSL\000010002\Functions(。此密钥应列出计算机上的所有密码套件。

  3. 如果您使用的是证书,请检查所提到的密码套件类型以及是否使用了椭圆曲线。在我的案例中,证书提到了NistP521曲线(公钥参数ECDSA_P521(,它在windows中默认不启用。我不得不修改注册表以启用它(我将注册表值Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\LOCAL\SSSL\000010002\Functions\EccCurves从以下位置更改:曲线25519NistP256NistP384

曲线25519NistP256NistP384NistP521

希望以上任何一项都能让你走上正轨。

最新更新