Kestrel 和 OpenSSL 密码套件

Kestrel and OpenSSL cipher suites

如何从 Linux docker 容器中更改 OpenSSL/Kestrel 可用的密码套件?

首先,让我们从一些环境细节开始:

我的 Program.cs 看起来像这样,它设置了红隼:

builder.UseKestrel(o => o.UseHttps(new HttpsConnectionFilterOptions
            {
                SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11,
                CheckCertificateRevocation = true,
                ClientCertificateMode = ClientCertificateMode.AllowCertificate 
                ServerCertificate = new X509Certificate2(certificate.Pfx, certificate.Password)
            }))
    .UseUrls(bindTo);

关键是:

SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11,

无论我在此处设置什么值(Tls12、Tls11、Tls 或其中的任何子集),它似乎都不会影响可用于连接的密码套件。我正在查看我的 URL 的 sslLabs 报告,由于旧协议上 RC4 密码的可用性,该报告被限制在 B 级。这是我想要解决的问题,我相信只支持 TLS1.1 和 1.2 应该可以解决这个问题。

但是例如,正如您在上面看到的,我没有提到 TLS 1.0,但它在报告中可用,这让我有点难过。

它实际上是在使用代码,还是从其他地方获取可用的密码?因为看起来 SslProtocols 属性 的值确实没有区别。

使用 Apache 时,您可以通过配置文件 (httpd.conf) 配置可用的密码套件,所以我想 kestrel 可能有一个文件可以做同样的事情,但我没有找到一个.普遍的共识似乎是用代码处理它。据我所知,我做了哪些?

然后我考虑使用 Apache 作为面向 Internet 的 Web 服务器来处理密码管理,然后将请求代理到 kestrel,但这将违反该项目的合同,我们指定所有数据将保留在传输的每个阶段都加密。在将数据重新加密以传输到 kestrel 之前,先在 Apache 中解密数据的过程不可行。

然后我想也许 OpenSSL 有一个类似于 Apache 的配置文件,我可以只改变那个配置来实现我需要的。我在我们的文件系统中找到了这两个文件:

/usr/lib/ssl/openssl.cnf
/etc/ssl/openssl.cnf

但是它们都没有任何密码套件列表,我希望在与 Apache 配置文件进行比较时看到这些列表。或许是这样,我只是误解了文件格式?

我也遇到过这种可以用来配置可用密码套件的方法'SSL_CTX_set_cipher_list',但我认为这只适用于C++,C#没有类似的functionality/wrapper我找到。我想在设置网站之前推入 docker 时可以编写一个 C++ 程序来设置密码套件吗?但这听起来真的很老套,我更愿意让网站自己处理它。

长话短说,我很快就运行没主意了。因此,非常感谢您的任何意见。感谢您提供的任何帮助!

密码套件选择和 TLS 版本配置尚未实现。在 GH 上检查此问题:https://github.com/aspnet/KestrelHttpServer/issues/1865

由于 kestrel 已准备就绪,因此将来可能会为此进行配置。最重要的是,他们想要一个流线型的,也就是所有 OS 相同的配置 API。

好像在ASP.NETCore 3.0解决了,可以在"CipherSuitesPolicy"下看到 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.0