在.NET Core 3.1中实现HTTPS

2020-07-08 16:32:36

在ASP.NET核心中,默认情况下启用https。HttpsRedirect中间件类提供执行从http到https的重定向所需的功能。启动时的UseHttpsRedirect扩展方法用于强制执行此操作。默认情况下,此扩展方法发出307临时重定向响应。然后,它使用配置的https端口指定重定向端点。如果没有在代码中指定https端口,该类将从HTTPS_PORT环境变量或IServerAddress功能获取https端口。如果没有指定它们中的任何一个,那么中间件将记录一个警告,并且不会重定向。下面的代码显示了将https重定向中间件添加到服务集合并使用它的示例。下面的代码检查环境,并在生产环境中设置到HTTPS端点的永久重定向,在开发环境中设置临时重定向。

为了能够在开发环境中使用HTTPS,.Net Core提供了一个全局工具,该工具可以在本地环境上创建自签名证书。以下命令可以安装此工具。

该工具现在可以用于通过以下命令生成自签名证书。-ep标志表示将导出证书的导出路径,-p标志表示生成证书所需的密码。我们可以使用-Trust选项来信任生成的证书。

在Linux/Mac OS上,我们可以使用OpenSSL为本地环境生成证书。然而,信任证书是一个更加复杂的过程,这取决于Linux OS的版本和风格。

openssl req-new-x509-newkey rsa:2048-keyout dev-certificate.key-out dev-certificate.cer-day 365-subj/cn=localhost openssl pkcs12-export-out dev-certificate.pfx-inkey dev-certificate.key-in dev-certificate.cer。

可以使用环境变量ASPNETCORE_Kestrel__Certificates__Default__Path指定证书路径,并使用环境变量ASPNETCORE_Kestrel__Certificates__Default__Password指定密码。

Kestrel可以部署为边缘服务器,也可以使用反向代理(如IIS、NGINIX或Apache)进行部署。

当Kestrel部署为面向公共的边缘服务器时,可以使用以下代码将其配置为使用https以及特定的证书和端口

如果使用Apache或NGNIX等反向代理,则应该在调用https重定向中间件之前配置和设置转发的报头中间件。转发报头中间件应将X-Forwarded-Proto设置为https。这将启用代理处的HTTPS卸载和对Web应用的纯HTTP调用,并保证原始调用是在安全的HTTPS信道上进行的。这在非IIS场景(如NGINIX或Apache)中尤其重要。请参阅下面的代码来配置转发的报头中间件。

在集装箱化的环境中,可以选择在创建或启动容器的过程中生成证书,并在docker组合文件中指定相同的证书。然后可以使用环境文件来配置必要的环境变量,如下所示。

使用HTTPS重定向仍然存在较小的安全风险,因为用户可以在重定向到安全的HTTPS连接之前使用HTTP发出初始请求。为了克服这一点,HTTP严格传输安全(HSTS)协议在响应中添加一个标头,指示在向Web端点发送请求时只应使用HTTPS。一旦接收到HSTS标头,即使用户指定了HTTP URL,支持HSTS协议的客户端也将始终使用HTTPS向应用程序发送请求。在.Net Core3.1中,我们可以将HSTS中间件添加到管道中,如下所示。

在上面的代码中,我们将HSTS preload指定为true。HSTS预加载是浏览器中内置的一项功能,通过该功能,主机的全局列表仅在其站点上强制使用HTTPS。域被硬编码到浏览器中,这避免了最初的不安全请求,并确保仅使用HTTPS。另一个让很多人犯错的关键点是,即使您为localhost指定使用HSTS中间件,为IPv6和IPv4指定环回地址,也没有设置HSTS标头。这是因为默认情况下,ExcludeHosts参数排除这些地址。

总而言之,.NET核心提供了很多方法来为Web应用配置https,使用Kestrel作为边缘服务器,或者通过SSL卸载/TLS终止。它还提供了通过代码、配置或使用docker合成文件进行配置的选项。