0

我在 asp.net core 2.1/kestrel 上运行了一个无状态服务。该服务是通过 LB 和 SF Reverse Proxy 从外部保护和访问的。Service Fabric 版本是 6.3.187.9494。

我需要从响应中完全删除服务器标头,并且通过操作 KestrelServerOptions.AddServerHeader 在服务本身中执行此操作没有问题,但似乎ReverseProxy 添加了自己的服务标头,即 Microsoft-HTTPAPI/2.0

所以这就是我检查的方式 - 我从它运行的节点向服务的端点发出请求,但我没有得到服务器标头。然后我做同样的事情,但通过反向代理,我回来了 - 服务器:Microsoft-HTTPAPI/2.0。

通读ApplicationGateway/Http 设置,我发现名为RemoveServiceResponseHeaders的属性-

将从服务响应中删除的以半冒号/逗号分隔的响应标头列表;在转发给客户之前。如果设置为空字符串;按原样传递服务返回的所有标头。即不要覆盖日期和服务器

我已经将那个设置为“日期;服务器”并更新了集群,但没有运气,因为我仍然得到那个服务器头。

有什么建议么?

4

1 回答 1

2

恐怕您无法使用 ServiceFabric 中的常规“RemoveServiceResponseHeaders”配置来做到这一点。它只会删除从您的服务响应中收到的读者。

在 windows 上,Service Fabric HttpGateway 运行在HTTP.sys内核模块之上,该内核模块负责这个 header,SF 对此没有发言权。

在我走得更远之前,

如果您出于安全原因删除它,您应该重新考虑使用 SF 提供的内置 ApplicationGateway,它会暴露您所有的服务,目前无法控制通过它暴露哪些服务,我认为风险不仅仅是删除服务器标头,因为它不会公开真实的服务器名称。

更进一步,

要解决您的问题,您有两种选择:

  1. 您可以使用HTTP.sys注册表设置在机器上将其删除。

您需要DisableServerHeader在注册表项中添加 DWORD 值HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters并将其值设置为2.

在此处输入图像描述

此键控制 http.sys 在附加 http 响应标头“服务器”以用于发送给客户端的响应方面的行为。 默认值 0将使用应用程序提供给 http.sys 的标头值,或者将默认值“Microsoft-HTTPAPI/2.0”附加到响应标头。值 1 不会为 http.sys 生成的响应附加“服务器”标头(以 400、503 和其他状态代码结尾的响应)。值为 2 将阻止 http.sys 将“服务器”标头附加到响应中。如果响应中存在“服务器”标头,则不会将其删除,如果不存在,则不会添加。

请查看此答案并详细了解如何执行此操作:GET request to IIS return Microsoft-HttpApi/2.0

.

  1. 根据上面的描述,响应标头包含“Microsoft-HTTPAPI/2.0”,因为默认值为 0,原始响应不包含 Server 标头,如果您提供任何值,它将被使用。此外,将 SF 配置为不从响应中删除服务器标头,将 RemoveServiceResponseHeaders 配置设置为仅类似于“日期”,因为默认值为“日期;服务器”
于 2018-10-10T11:46:47.030 回答