除非先前从浏览器访问,否则HTTPS地址/域的cUrl超时

我已经失去了几天这个问题,希望它激发了一个人的想法。

我使用Powershell脚本将几个系统集成在一起。 我连接到的两个服务(托pipe的JIRA)中的一个可以从我的本地系统访问,但是从我的一个虚拟机运行时脚本会失败。 我偶然发现,如果我在服务器上为该主机的HTTPS URL打开/刷新了一个浏览器,那么脚本将能够通过HTTPS访问API约20-30秒。

当我远程进入服务器并从PowerShell控制台尝试此操作时收到超时错误。 然后我validation了与cUrl(详细输出如下)一样的行为。 刷新具有该域的浏览器,然后允许在短时间内访问HTTPS URL。 在SSL协商之前,似乎是在初始连接上超时。

代表PoSH命令:

Invoke-RestMethod -Method Get -Uri“ https://MYDOMAIN.atlassian.net/rest/api/2/issue/PLPT-1?fields=key,id,status ”-Headers @ {“Authorization”=“Basic” + [System.Convert] :: ToBase64String([System.Text.Encoding] :: UTF8.GetBytes('USERNAME:PASSWORD'))}

代表cUrl命令:

curl.exe“ https://MYDOMAIN.atlassian.net/rest/api/2/issue/PLPT-1?fields=key,id,status ”-u“USERNAME:PASSWORD”-v -X GET

我已经做了很多挖掘,我很难过。 我尝试过使用Wireshark进行更深入的挖掘,但是使用数据包嗅探器已经有好几年了,而且我很生疏,不得不学习UI。

故障排除:

以下是我在尝试隔离问题时所能想到的问题/答案:

  • 它是PowerShell?
    • 使用cUrl也会超时
  • 这一切都是HTTPS?
    • https://google.com/正常工作没有超时
    • https://localhost/...没有超时工作正常
  • 这是一个通过浏览器访问过JIRA的系统吗?
    • 我证实我的家庭桌面可以通过PoSH连接,尽pipe从来没有访问过JIRA
  • 它是主机,DC还是OS?
    • 这是Azure中的2008 R2 VM,我validation了PoSH和cUrl命令在运行2008 R2的第二个Azure VM中正常工作
  • 防火墙,防病毒?
    • 禁用防病毒和防火墙,cUrl + PoSH仍然超时
  • 用户代理?
    • 包括用户代理在问题系统或工作系统上并没有什么不同
  • 小提琴手说什么?
    • 提供SSL解密的提琴手导致网关错误发生,而不是超时,我还没有深入挖掘
  • 也许这是Atlassian的networking问题? 间歇连接?
    • 我一直从我的服务器上得到错误,并且从我尝试过的其他地方始终如一地工作
    • 我在服务器和本地连续执行了10个调用,并从服务器的10个本地和完美的超时获得完美的回报。 在服务器上执行浏览器刷新技巧之后,我连续有十个完美的回应。
  • 在Wireshark中看起来如何?
    • 使用cUrl:Wireshark显示最初的TCP呼叫熄灭,但它没有被确认,所以你会看到两个TCP重传尝试
    • 使用brower启动后的cUrl:Wireshark显示第一个TCP调用被确认,然后一切按预期工作

很短的时间,我以为我已经一直工作。 我正在使用-3 -4来强制SSL3和ipv4地址,它似乎工作,而我不得不主要与networking浏览器的连接。 不幸的是,重新启动后,这不再起作用。

我已经在服务器上尝试过的方法:

  • cUrl,cUrl与-3 -4
  • PoSH:Invoke-RestMethod,Invoke-WebRequest,WebClient,WebRequest / WebResponse,通过ServicePointManager将默认SSL设置为SSL3,通过系统默认设置代理和代理证书(如果有的话)
  • IE:工作
  • Chrome:有效

cUrl输出

这里是一些来自cUrl的示例输出。 我已经有一个浏览器打开到https://MYDOMAIN.atlassian.net (它坐在login屏幕上),但我已经坐了一会儿,所以连接将是陈旧的。

在刷新浏览器之前输出cUrl:

 * Hostname was NOT found in DNS cache * Trying 165.254.226.145... * connect to 165.254.226.145 port 443 failed: Timed out * Failed to connect to MYDOMAIN.atlassian.net port 443: Timed out * Closing connection 0 

刷新浏览器后立即运行cUrl输出:

 * Hostname was NOT found in DNS cache * Trying 165.254.226.145... * Connected to MYDOMAIN.atlassian.net (165.254.226.145) port 443 (#0) * successfully set certificate verify locations: * CAfile: C:\Users\Administrator\AppData\Local\Apps\cURL\bin\curl-ca-bundle.crt CApath: none * SSLv3, TLS handshake, Client hello (1): * SSLv3, TLS handshake, Server hello (2): * SSLv3, TLS handshake, CERT (11): * SSLv3, TLS handshake, Server key exchange (12): ... rest of handshake and HTML for a 401 error page because I didn't force pre-authentication ... 

更新

我将Wireshark结果添加到上面的问题。

我现在也发现,如果我运行cUrl命令,并在它超时之前取消它,并立即再次运行,它是成功的。 如果我让cUrl命令超时,立即再次运行它,它会再次超时。

如果我运行PoSH命令,并在它超时之前取消它,并立即再次运行,我可以成功地连续运行5次以上。

这确实是一个networking相关的东西,我要看看如果重新运行命令最终会达到一个点,它再次超时,或者如果取消第一个电话以某种方式让我继续进行后续调用,只要我可以(这可能是可能的,我认为PoSH在初始连接形成之后利用保持活力)。

我的临时“解决scheme”是在初始调用时使用短暂的超时,如果失败则立即重试。 超时时间足够短,在这台服务器上它失败,然后再次重试足够快,成功开始通信(就像当我手动运行它,取消它,然后再次运行)。

到目前为止,它看起来像有一个超时,重试是足够好的,以保持自动化脚本的其余部分的连接工作没有问题。

这是一个解决方法,我仍然在寻找根本原因和更好的答案。