Kestrel和OpenSSL密码套件

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

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

  • 我们使用通过powershell连接的Linux docker容器(Docker版本17.06.0-ce,build 02c1d87)
  • 它拥有一个用C#编写的ASP.Net Core(netcore 1.1)web应用程序。
  • 主要是针对.NetStandard 1.4 / 1.6写的,但是计划到2.0。
  • 我们使用Kestrel作为Docker容器上的Web服务器
  • 据我所知,Kestrel正在使用openSSL(1.0.1)。

我的Program.cs看起来像这样,它build立了茶隼:

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或其中的任何子集),它似乎都不会影响可用于连接的密码套件。 我将通过sslLabs报告来查看我的URL,由于旧协议上的RC4密码的可用性,该报告被限制在B级。 我想sorting的是这个问题,我相信只要支持TLS1.1和1.2就可以解决这个问题。

但是,举个例子,正如你上面所看到的,我没有提到TLS 1.0,但是它在报告中可以find,这有点让我难住。

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

当使用Apache时,你可以通过configuration文件(httpd.conf)configuration可用的密码套件,所以我认为kestrel可能有一个文件来做同样的事情,但我没有设法find一个。 普遍的共识似乎是用代码来处理。 据我所知,我已经做了?

然后,我考虑使用Apache作为面向Internet的Web服务器来处理密码pipe理,然后将请求代理到kestrel上,但这会违反此项目的合同,我们指定所有数据在每个阶段都会保持encryption过境。 在重新encryption它以便转运到红隼之前,解密Apache中的数据的过程是不可行的。

然后我想,也许OpenSSL有一个类似Apache的configuration文件,我可以改变这个configuration来实现我所需要的。 我在我们的文件系统中find了这两个文件:

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

但是他们都没有任何我希望与Apacheconfiguration文件比较时会看到的密码套件列表。 或者也许是这样,我只是误解了文件格式?

我也遇到了这种方法,可以用来configuration可用的密码套件SSL_CTX_set_cipher_list,但我认为这只在C ++中可用,并没有类似的C#function/包装,我发现。 我想在build立网站之前,可以编写一个C ++程序来设置密码套件。 但是,这听起来很不方便,我宁愿让网站自己处理它。

长话短说,我正在迅速用完想法。 所以你有任何input是非常感激。 感谢您的任何帮助,您可以提供!

密码套件select和TLS版本configuration尚未实现。 在GH上检查这个问题: https : //github.com/aspnet/KestrelHttpServer/issues/1865

由于红隼已经准备好了,将来可能会有这样的configuration。 最重要的是,他们想要一个简化的,也就是说所有操作系统都是相同的configurationAPI。