为什么我们的服务器会收到来自安卓应用的CONNECT方法请求,而我们在代码中并未使用它?

16

一些用户抱怨网络问题。我们的Android应用程序通过https与服务器通信。

我们的Apache日志显示了状态为“405方法不允许(CONNECT)”的响应,这个问题只在特定的IP地址上重现。

我不明白为什么Android应用程序尝试使用CONNECT方法与服务器建立连接,因为我从来没有在应用程序中使用过该方法,我只使用GET、POST或PUT方法。

看起来代理可能涉及到了这个问题,但是我不知道如何解决它。有人知道吗?


也许你正在被黑客攻击中 :P - xanexpt
我不使用IIS,我提到了Apache,版本是2.4。 - tbruyelle
1
你如何确保这些请求是从你的安卓应用程序发送的? - ljk321
只有非常少量的用户在抱怨,而且并不是每次都发生。目前我在使用Spring rest模板。我相当确定这些问题来自于安卓应用程序,因为它们紧随同一设备的标准请求之后立即出现。 - tbruyelle
它并不是通用的,而是从请求参数和秘密密钥计算出特定的base64头。 - tbruyelle
显示剩余11条评论
3个回答

9

查看http connect的维基百科

在HTTP代理服务器后面时,HTTP隧道的一种变化是使用“CONNECT” HTTP方法。[1][2]

不想说废话,但在Apache中启用connect方法似乎是答案。比要求客户删除其代理服务器更容易。


8

您需要为 CONNECT HTTP 方法提供支持,该方法通常用于通过代理服务器隧道传输 SSL 请求。这就是为什么您会收到它们,因为一些用户在代理后面。

在 Apache 中,要启用处理 CONNECT 请求,必须在服务器中存在 mod_proxymod_proxy_connect

问题是您需要保护您的服务器,这可能会使您的应用程序失去意义。

如果您没有保护服务器,请勿启用 mod_proxy 和 mod_proxy_connect。


我知道那个选项,但服务器团队告诉我他们不想启用mod_proxy,因为可能会有未知的副作用。 - tbruyelle
1
如果没有它,Apache将无法处理CONNECT请求,这让人感到沮丧。您应该考虑使用http而不是https来防止CONNECT请求并自行加密数据,或更改为允许您启用所需内容的托管提供商。 - Francisco Félix
1
但这并不是问题的解决方案!如果一段代码被设计来处理针对服务器的GET和POST方法。如果日志显示某个特定IP使用CONNECT方法,则存在用户端或网络架构(防火墙/反向代理)的问题。启用Apache模块以处理特定用例/故障并不是适当的解决方案。 - Matt
2
@Matt 这不是用户端的问题。这是代理服务器代表其后面的客户端发送请求的标准网络实践。 - Brian from state farm
他没有在运行https代理,你为什么要让他把Apache变成代理服务器?CONNECT方法需要启用https代理服务器,而不是最终目标服务器(网站服务器)。1) client ----connect---->proxy-----tcp connection--->server2) client <--------->proxy<-------->server请参考此来源,了解https代理服务器的工作原理。 - Accountant م

1
我无法提供一揽子解决方案,因为这里的关键在于您支持的Android应用程序的源代码树,以及与您雇主基础设施政策有关的变量组合。您需要回答三个重要问题,并且对于每个作为Apache管理员遇到的问题都应该这样做:
  1. “问题”客户端上次能够无问题连接是什么时候?
  2. 那时到现在发生了什么变化,何时发生了变化?
  3. CONNECT消息是否与客户端报告的错误相关联?
问题一和问题二是优先考虑的,但不应在像这样的公共论坛上进行深入讨论。您公共或私人配置、应用程序等所做的更改通常被视为您雇主的知识产权。如果您在此处或任何地方讨论此事,请谨慎。如果您发现已经进行了更改,即使是“无害”的更改,请发现它们与客户问题的相关性,并在适当的情况下实施回归测试。
我将讨论第三个问题。根据我阅读的信息,尚未证实CONNECT与每个客户问题相关。似乎有些客户报告了问题,并且您查看了日志以了解问题的症状。CONNECT错误似乎是一个问题,基于您分享的一些Android应用程序规范,它们可能是问题所在。然而,它们也可能是由于某人扫描您的服务器以寻找易受攻击模块而产生的“日志噪音”。
如果您尚未证明CONNECT与客户错误的相关性,请尝试使用<If>指令并记录发出CONNECT语句的客户端的其他数据。以下是一个通用示例:
<If "%{REQUEST_METHOD} == CONNECT">
    ... some extra log format fields to get ALL of the data ...
    ... maybe a special log file just for CONNECTers?
</If>

使用收集的数据来了解趋势。可能只有特定版本的Android与您的应用程序表现出这种行为。您可以分支<If>以更改那些用户接收内容的方式,或者您可以与您的Android应用程序开发人员合作(当前的应用程序或下一个您雇用的应用程序)基于应用程序本身开发Web服务器要求列表。
更好的是,一个构建良好的块可以使您捕获特定客户端的调试数据,而不会干扰那些应用程序正常工作的客户端。与往常一样,我建议先在实验室中构建和测试;永远不要将全新的想法部署到生产环境,并且绝对不要启用模块,因为互联网告诉您,即使他们在命名模块时是正确的。
以下是Apache关于<If>指令的文档链接:

http://httpd.apache.org/docs/2.4/mod/core.html#if
http://httpd.apache.org/docs/2.4/expr.html

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接