如何在 Azure 应用服务/Web 应用上仅强制执行 HTTPS(无重定向、阻止 HTTP)
Posted
技术标签:
【中文标题】如何在 Azure 应用服务/Web 应用上仅强制执行 HTTPS(无重定向、阻止 HTTP)【英文标题】:How to enforce HTTPS only (no redirect, block HTTP) on Azure App Service / Web App 【发布时间】:2022-01-08 23:39:18 【问题描述】:Microsoft's own documentation on HSTS 对 HSTS、HTTPS 重定向和 API 说了以下内容:
Web API 应该:
不监听 HTTP。 关闭状态码为 400(错误请求)的连接并且不处理请求。…
…通过 HTTP 对 API 的单个经过身份验证的调用会在不安全的网络上存在风险。安全的方法是将 API 项目配置为仅通过 HTTPS 侦听和响应。
我的收获是:API 不应该重定向,因为客户端可能很乐意通过 HTTP 发送敏感数据,并且由于重定向,一切都“正常工作”。即使对于浏览器和使用 HSTS 时,第一个请求(带有潜在敏感数据)也可以使用 HTTP 完成。相反,API 应该失败 HTTP 请求并仅通过 HTTPS 响应。
在花了一天的大部分时间研究这个之后,我发现在 Azure 应用服务/Web 应用中,似乎没有简单的方法来遵循这些建议。无论“HTTPS Only”是打开还是关闭,都可以通过 HTTP 调用 API:如果打开,它会重定向到 HTTPS,如果关闭,它完全可以通过 HTTP 使用而无需重定向。有人会认为有一种简单的方法可以让应用服务/网络应用仅通过 HTTPS 进行侦听。例如,如果“仅 HTTPS”按钮是关闭/重定向/打开。
文件说:
要在 API 中禁用 HTTP 重定向,请设置 ASPNETCORE_URLS 环境变量或使用 --urls 命令行标志。有关详细信息,请参阅 Andrew Lock 的 Use multiple environments in ASP.NET Core 和 5 ways to set the URLs for an ASP.NET Core app。
不幸的是,这两个链接都没有描述这是否与应用服务/Web 应用相关,或者环境变量应该是什么。我无法让它工作。这似乎还需要复制任何自定义域,迫使您记住使环境变量与自定义域的更改保持同步。
如何使 Azure 应用服务/Web 应用仅在 HTTPS 上侦听?
【问题讨论】:
【参考方案1】:我当前的解决方法是部署以下web.config
,具有讽刺意味的是,它要求“仅 HTTPS”关闭,HTTP 请求才能到达应用服务并被拒绝。但是,它确实可以确保不会开发仅 HTTP 的 API 客户端,因为它们从一开始就无法正常工作。
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Disable HTTP" enabled="true" stopProcessing="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="HTTPS" pattern="off" />
<add input="WARMUP_REQUEST" pattern="1" negate="true" />
</conditions>
<action type="CustomResponse" statusCode="400" statusReason="HTTPS Required" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
如果有人有更好、更简单或更官方的方法,我很乐意接受这个答案。另外,我不确定WARMUP_REQUEST
部分是否有效(从其他地方复制);如果我将CustomResponse
更改为AbortRequest
,插槽交换操作将失败,因为预热请求被丢弃。
【讨论】:
如果您的最终关注点是“我的结论是:API 不应该重定向,因为客户端可能很乐意通过 HTTP 发送敏感数据,并且由于重定向而一切都“正常工作””,那么上面的这条规则是也无用,因为在执行重写规则时初始 HTTP 请求已经到达服务器端。如果包含任何敏感信息,那么坏事已经发生了。正确的做法是阻塞80端口***.com/questions/57981432/… 目标不是阻止某人真正有动机发送一次性 HTTP 请求(并得到错误)。目标是避免使用 HTTP 的开发不佳的 API 客户端。只要 API 不能通过 HTTP(直接或通过重定向)工作,开发人员就不会创建通过 HTTP 发送数据的客户端。使用重定向,API 客户端开发人员可以使用 HTTP 而不是更明智,因为浏览器或其他软件可以透明地处理重定向。但如果 API 对 HTTP 请求返回错误,则此类 API 客户端将永远不会被用户发布和使用。以上是关于如何在 Azure 应用服务/Web 应用上仅强制执行 HTTPS(无重定向、阻止 HTTP)的主要内容,如果未能解决你的问题,请参考以下文章
如何强制我的本地 Azure 函数服务器使用 HTTP 2.0 而不是 1.1?
Azure Service Fabric - 如何配置容器被强制终止之前的时间间隔
从 azure web 应用程序提供 logstash。如何?