Я делаю автоматический скрипт для чтения списка с сайта, на котором размещается последний скомпилированный код. Это то, что я уже понял. Следующая часть сценария - получить этот скомпилированный код с сервера с ненадежным сертификатом.
Вот как я собираюсь взять файл:
$web = new-object System.Net.WebClient
$web.DownloadFile("https://uri/file.msi", "installer.msi")
Затем я получаю следующую ошибку:
Exception calling "DownloadFile" with "2" argument(s): "The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel."
Я знаю, что что-то упускаю, но не могу найти правильный способ поиска.





Вам нужно написать обработчик обратного вызова для ServicePointManager.ServerCertificateValidationCallback.
Брэд прав, но обратите внимание, что PowerShell V1 на самом деле не имеет встроенной поддержки делегатов, которая вам понадобится в этом конкретном случае. Я считаю, что это должно обойти тебя это ограничение (на самом деле сценарий, который вы описываете, является в точности одним из использованных примеров).
Если вы используете PowerShell и столкнулись с этой ошибкой. Используйте команду:
[Net.ServicePointManager] :: SecurityProtocol = [System.Net.SecurityProtocolType] :: Tls12
перед загрузкой пакета. Это заставляет PS использовать TLS 1.2.
Причина сбоя может заключаться в том, что веб-сайт, с которого вы пытаетесь выполнить загрузку, отключил поддержку TLS 1.0, которую PS использует по умолчанию.
Простейшая реализация ServerCertificateValidationCallback в PowerShell - это блок сценария, который всегда возвращает значение true. У меня это работает в PowerShell версии 5.1; не тестировал на других версиях.
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
См. блог Бхаргава Шуклы
Это правильно. Мне пришлось создать ConsoleApp, чтобы я мог это сделать. Я больше не мог ломать голову над тем, чтобы понять это в PowerShell.