Ошибка установки Unable to resolve package source в PowerShell
Доброго времени суток. Уважаемые читатели блога Pyatilistnik.org. В прошлый раз мы с вами успешно разобрали ошибку whea uncorrectable error в операционной системе Windows 10. Идем далее, и сегодня речь пойдет про ошибки установок модулей PowerShell, а в частности мы поговорим, как правильно установить NuGet, который участвует в установке других модулей расширяющих возможности PowerShell. Уверен, что те кто еще использует операционные системы ниже Windows 10, будет особенно полезно.
Ошибка установки модулей PowerShell (Unable to resolve package source)
Потребовалось мне произвести установку дополнительных модулей, которые я обычно использую в своей практике, например VMware.PowerCLI или TerminalSession, но не тут то было, я стал получать при выполнении привычных команд ошибки.
ПРЕДУПРЕЖДЕНИЕ: Unable to resolve package source 'https://www.powershellgallery.com/api/v2/'.
PackageManagement\Install-Package : Совпадения для указанных условий поиска и имени пакета "Pscx" не найдены. Чтобы про
смотреть все доступные зарегистрированные источники пакетов, используйте командлет Get-PSRepository.
C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1809 знак:21
+ ... $null = PackageManagement\Install-Package @PSBoundParameters
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Ex
ception
+ FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage
PS C:\Windows\system32> Install-Module -Name VMware.PowerCLI
Для продолжения требуется поставщик NuGet
Для взаимодействия с репозиториями на основе NuGet модулю PowerShellGet требуется версия поставщика NuGet "2.8.5.201"
или более новая. Поставщик NuGet должен быть доступен в "C:\Program Files\PackageManagement\ProviderAssemblies" или
"C:\Users\sem\AppData\Local\PackageManagement\ProviderAssemblies". Поставщик NuGet можно также установить, выполнив
команду "Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force". Вы хотите, чтобы модуль PowerShellGet
установил и импортировал поставщик NuGet прямо сейчас?
[Y] Да - Y [N] Нет - N [S] Приостановить - S [?] Справка (значением по умолчанию является "Y"): Y
ПРЕДУПРЕЖДЕНИЕ: Не удалось скачать в "", используя универсальный код ресурса (URI)
"https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409".
ПРЕДУПРЕЖДЕНИЕ: Не удалось скачать список доступных поставщиков. Проверьте подключение к Интернету.
PackageManagement\Install-PackageProvider : По указанному поисковому запросу поставщика "NuGet" не найдено совпадений.
Для поставщика пакета требуется указать теги "PackageManagement" и "Provider". Проверьте наличие тегов в указанном пакете.
C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:7405 знак:21
+ ... $null = PackageManagement\Install-PackageProvider -Name $script:N ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (Microsoft.Power...PackageProvider:InstallPackageProvider) [Install-Pac
kageProvider], Exception
+ FullyQualifiedErrorId : NoMatchFoundForProvider,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackagePro
vider
PackageManagement\Import-PackageProvider : Для указанных условий поиска и имени поставщика "NuGet" не найдено совпадений. Попытайтесь выполнить команду "Get-PackageProvider -ListAvailable", чтобы увидеть, существует ли провайдер в этой системе.
C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:7411 знак:21
+ ... $null = PackageManagement\Import-PackageProvider -Name $script:Nu ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (NuGet:String) [Import-PackageProvider], Exception
+ FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.ImportPackageProv
ider
Немного изучив данный вопрос, я понял, что тут дело вот в чем. Небольшая цитата от Microsoft "В Microsoft использование новейших и безопасных методов шифрования очень важно для обеспечения безопасности и конфиденциальности наших клиентов. Известно, что TLS 1.0 и TLS 1.1, выпущенные в 1999 и 2006 годах соответственно, уязвимы для ряда атак, включая POODLE и BEAST . В прошлом мы убрали поддержку SSL 3, потому что он также был уязвим для атак. По этим причинам NuGet.org прекратит поддержку TLS 1.0 и 1.1. Это означает, что вы больше не сможете восстанавливать пакеты, загружать пакеты или просматривать NuGet.org, используя эти устаревшие протоколы безопасности. Подавляющее большинство запросов, которые мы получаем с использованием этих протоколов, относятся к нашему устаревшему API V2 (Например https://www.powershellgallery.com/api/v2/), который был заменен нашим API V3 в 2015 году. Чтобы быть готовым к этому переходу, убедитесь, что ваши системы поддерживают TLS 1.2 или выше."
В итоге произошло следующее:
- Февраль 2020 г - Временно прекращается поддержка TLS 1.0/1.1 в 3 часовых поясах по 4 часа в каждом, чтобы обеспечить совпадение с обычными рабочими часами по всему миру.
- Апрель 2020 г - окончательное удаление поддержки TLS 1.0/1.1.
Значит пора вашу систему перевести на использование TLS 1.2. Еще вариант подобной ошибки.
PackageManagement\Install-Package : No match was found for the specified search criteria and module name 'AzureAD'. Try
Get-PSRepository to see all available registered module repositories.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1772 char:21
+ ... $null = PackageManagement\Install-Package @PSBoundParameters
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Ex
ception
+ FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage
Как проверить, что система использует TLS 1.2
Все операционные системы Windows, начиная с Windows 8, по умолчанию поддерживают TLS 1.2. Если у вас возникли проблемы с подключением (ошибка "Не удалось создать защищенный канал SSL/TLS"), убедитесь, что TLS 1.2 явно не отключен в вашей системе. Для этого откройте командную строку или оболочку PowerShell и выполните команды:
- reg query "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\ SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /reg:32
- reg query "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\ SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /reg:64
Команды должны либо выдавать ошибку "Не удается найти указанный раздел или параметр в реестре", либо иметь значение 1
в системе, в которой включена поддержка TLS 1.2.
Следующие команды должны либо выдавать ошибку "Не удается найти указанный раздел или параметр в реестре", либо иметь значение "0"
в системе, в которой включена поддержка TLS 1.2.
Как включить поддержку TLS 1.2
Следующие команды помогут активировать поддержку TLS 1.2:
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\ SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f /reg:32
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\ SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f /reg:64
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\ SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f /reg:32
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\ SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f /reg:64
Если у вас Windows 7, то требует установки обновления (https://www.catalog.update.microsoft.com/search.aspx?q=kb3140245) и следующих обновлений реестра, чтобы включить поддержку TLS 1.2:
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\ SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f /reg:32
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\ SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f /reg:64
Кроме того, PowerShell по умолчанию также использует TLS 1.0. Это можно исправить, изменив версию TLS по умолчанию для .NET Framework, которая настроена в разделах реестра:
- reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:64
- reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:32
Теперь исправив ключи реестра можно смело активировать поддержку современных версий TLS в PowerShell
Если не помогло, то попробуйте вот такое выражение:
$webclient.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
[Net.ServicePointManager]::SecurityProtocol = "tls12"
Как видите теперь запустив команду на установку нужного модуля, все отрабатывает как швейцарские часы и ошибка "Unable to resolve package source" не появляется.
Дополнительные ссылки
- https://devblogs.microsoft.com/nuget/deprecating-tls-1-0-and-1-1-on-nuget-org/
- https://social.technet.microsoft.com/Forums/ru-RU/3c917354-e540-4b77-a29b-4553a93459b2/powershellget-1080-nuget-109110891090107210851086107410821072?forum=itru
Надеюсь, что теперь вы сможете все обновить, зная что все теперь идет по TLS 1.2. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org.
Спасибо мне помогло.