Назад | Перейти на главную страницу

cUrl для HTTPS-адреса / домена истекает, если ранее к нему не обращались из браузера

Я потерял пару дней из-за этой проблемы и надеюсь, что это заставит кого-то задуматься.

Я объединяю несколько систем вместе, используя сценарии Powershell. К одной из двух служб, к которым я подключаюсь (размещенная JIRA), можно получить доступ из моей локальной системы, но скрипт завершится ошибкой при запуске с одной из моих виртуальных машин. Случайно я обнаружил, что если я открою / обновлю браузер на сервере для URL-адреса HTTPS для этого хоста, тогда скрипт сможет получить доступ к API через HTTPS в течение примерно 20-30 секунд после этого.

Я получаю сообщение об ошибке тайм-аута, когда подключаюсь к серверу и пытаюсь сделать это из консоли PowerShell. Затем я подтвердил, что такое же поведение происходит с cUrl (подробный вывод включен ниже). Затем обновление браузера с этим доменом позволяет обоим получать доступ к URL-адресам HTTPS в течение короткого периода времени. Похоже, что время ожидания исходного соединения истекло до согласования 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" ИМЯ ПОЛЬЗОВАТЕЛЯ: ПАРОЛЬ "-v -X ПОЛУЧИТЬ

Я много копал в этом вопросе и довольно озадачен. Я действительно пробовал использовать Wireshark, чтобы копать глубже, но прошло много лет с тех пор, как я использовал анализатор пакетов, а я уже заржавел и должен изучить пользовательский интерфейс.

Исправление проблем:

Вот вопросы / ответы, которые я мог придумать, пытаясь изолировать проблему:

В течение короткого периода времени мне казалось, что cUrl работает стабильно. Я использовал -3-4 для принудительного использования адресов SSL3 и ipv4, и, похоже, он работал без необходимости настраивать соединение с помощью веб-браузера. К сожалению, после перезагрузки это больше не работает.

Методы, которые я пробовал на сервере:

cUrl Вывод

Вот пример вывода cUrl. У меня уже есть браузер, открытый для https://MYDOMAIN.atlassian.net (он находится на экране входа в систему), но я оставил его на некоторое время, чтобы соединение было устаревшим.

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+ раз подряд.

Это определенно что-то связанное с сетью, я собираюсь посмотреть, дойдет ли повторный запуск команды в конечном итоге до точки, когда время снова истечет, или если отмена первого вызова каким-то образом позволяет мне продолжать делать последующие вызовы, пока я могу ( что может быть возможно, я думаю, что PoSH использует сохранение активности после создания начального соединения).

Для очень похожих симптомов (подробный вывод curl при сбое или прохождение), но для периодических сбоев с помощью только curl из CL мы появиться чтобы обнаружить, что эта дополнительная опция curl эффективно решает эту проблему:

--connect-timeout 30

Мое временное «решение» - использовать короткий тайм-аут для начальных вызовов и немедленно повторить попытку, если они потерпят неудачу. Тайм-аут достаточно короткий, чтобы на этом сервере он терпел неудачу, а затем повторял попытку достаточно быстро, чтобы начать успешное общение (точно так же, как когда я запускал его вручную, отменял и снова запускал).

Пока что одного тайм-аута и повторной попытки достаточно, чтобы соединение работало, а остальная часть сценария автоматизации работала без проблем.

Это обходной путь, я все еще ищу основную причину и лучший ответ.