Kestrel 和 OpenSSL 密码套件
Kestrel and OpenSSL cipher suites
如何从 Linux docker 容器中更改 OpenSSL/Kestrel 可用的密码套件?
首先,让我们从一些环境细节开始:
- 我们使用通过 powershell
连接的 Linux docker 容器(Docker 版本 17.06.0-ce,构建 02c1d87)
- 它托管一个用 C# 编写的 ASP.Net 核心 (netcore 1.1) 网络应用程序。
- 主要针对 .NetStandard 1.4/1.6 编写,但计划转向 2.0。
- 我们在 docker 容器
上使用 Kestrel 作为 Web 服务器
- 据我所知,Kestrel 在后台使用 openSSL (1.0.1)。
我的 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
如何从 Linux docker 容器中更改 OpenSSL/Kestrel 可用的密码套件?
首先,让我们从一些环境细节开始:
- 我们使用通过 powershell 连接的 Linux docker 容器(Docker 版本 17.06.0-ce,构建 02c1d87)
- 它托管一个用 C# 编写的 ASP.Net 核心 (netcore 1.1) 网络应用程序。
- 主要针对 .NetStandard 1.4/1.6 编写,但计划转向 2.0。
- 我们在 docker 容器 上使用 Kestrel 作为 Web 服务器
- 据我所知,Kestrel 在后台使用 openSSL (1.0.1)。
我的 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