Я потерял пару дней из-за этой проблемы и надеюсь, что это заставит кого-то задуматься.
Я объединяю несколько систем вместе, используя сценарии 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, чтобы копать глубже, но прошло много лет с тех пор, как я использовал анализатор пакетов, а я уже заржавел и должен изучить пользовательский интерфейс.
Вот вопросы / ответы, которые я мог придумать, пытаясь изолировать проблему:
https://google.com/
отлично работает без тайм-аутаhttps://localhost/...
отлично работает без тайм-аутаВ течение короткого периода времени мне казалось, что cUrl работает стабильно. Я использовал -3-4 для принудительного использования адресов SSL3 и ipv4, и, похоже, он работал без необходимости настраивать соединение с помощью веб-браузера. К сожалению, после перезагрузки это больше не работает.
Методы, которые я пробовал на сервере:
Вот пример вывода 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
Мое временное «решение» - использовать короткий тайм-аут для начальных вызовов и немедленно повторить попытку, если они потерпят неудачу. Тайм-аут достаточно короткий, чтобы на этом сервере он терпел неудачу, а затем повторял попытку достаточно быстро, чтобы начать успешное общение (точно так же, как когда я запускал его вручную, отменял и снова запускал).
Пока что одного тайм-аута и повторной попытки достаточно, чтобы соединение работало, а остальная часть сценария автоматизации работала без проблем.
Это обходной путь, я все еще ищу основную причину и лучший ответ.