dotnet: как грузить nuget-пакеты в случае, если https сломан?

я получил рабочий ноутбук, и попробовал установить туда весь нужный для разработки софт.

Оказалось, что у меня есть Win 10, в которой я "просто user", то есть не могу устанавливать программы и даже запускать программы в обход "белого списка". Но в ней есть wsl2, и там я уже администратор. я довольно легко поставил dotnet core sdk 8.0.

Но когда я выполнил первую команду dotnet new console я получил ошибку:

dotnet new console cert error

    konst@cmp10:/mnt/c/Users/user/MyProjects/prj1$ dotnet new console
    The template "Console App" was created successfully.


    Processing post-creation actions...

    Restoring /mnt/c/Users/user/MyProjects/prj1/prj1.csproj:

    Determining projects to restore...

    /usr/share/dotnet/sdk/8.0.101/NuGet.targets(156,5): error : Unable to load the service index for source https://api.nuget.org/v3/index.json. [/mnt/c/Users/user/MyProjects/prj1/prj1.csproj]

    /usr/share/dotnet/sdk/8.0.101/NuGet.targets(156,5): error :   The SSL connection could not be established, see inner exception. [/mnt/c/Users/user/MyProjects/prj1/prj1.csproj]

    /usr/share/dotnet/sdk/8.0.101/NuGet.targets(156,5): error :   The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot [/mnt/c/Users/user/MyProjects/prj1/prj1.csproj]

    Restore failed.

    Post action failed.

    Manual instructions: Run 'dotnet restore'

"Хм" - полумал я - "Неужели действительно не грузит индекс?" - и попробовал wget https://api.nuget.org/v3/index.json

wget ругнулся:

    ERROR: cannot verify api.nuget.org's certificate, issued by ‘CN=Kaspersky Endpoint Security Personal Certification Authority,O=AO Kaspersky Lab’:

      Self-signed certificate encountered.

    To connect to api.nuget.org insecurely, use `--no-check-certificate'.

И тут я понял...

На моём хосте (Win 10) установлен Касперский. которому, в силу его любопытства, нужно читать весь трафик, идущий с моего компа и обратно, причем, даже в том случае, когда это https-трафик.

Как я понимаю, для этого он фактически осуществляет атаку MITM в пределах моего хоста:

он перехватывает запросы к любому сайту. При этом он от имени сайта отвечает, подписывая трафик своим собственным сертификатом. В том случае, если программе (которая посылает запрос) на это наплевать, по всё получается:

kaspersky знает запрос, потому что он сам "прикидывается любым сайтом интернете"

когда он знает запрос - он может его послать дальше, на настоящий сайт по установленному с ним настоящему шифрованному каналу.

Когда он от настоящего сайта получает ответ - он его передаёт программе - получателю.

И схема "ломается" для программ, которые правда проверяют сертификат: они понимают. что "MITM! в канале затаился шпион!"

И если wget'у можно сказать "Плюнь!" при помощи ключика --no-check-certificate, то для dotnet (фактически - для nuget) я такого ключика не нашел.

я, конечно, погуглил, и наткнулся на советы типа

    dotnet dev-certs https --clean
    dotnet dev-certs https --trust

Но это ник чему не привело.

Также, я встретил issue 2017-го года, который коротко сводится к "в npm'е есть игнорирование проверки сертификатов, в Maven'е - есть, в PHP Composer'е - есть, доколе же мы будем страдать!?" И пока этот issue - открыт.

Итак.

Поменять настройки хоста я не могу. Это - правило: "Windows 10 - наш Бох, а Касперский - пророк его, и нефиг всяким немытым программистам трогать святые настройки" (это был сарказм, но ситуация на самом деле такая)

Ключа, который бы приказал dotnet'у игнорировать проверку сертификатов - я не знаю.

Теоретически, остаётся еще один очень трудоёмкий путь: я могу добавить в качестве источника пакетов локальный сайт. На нём - проворачивать всё в обратном порядке: запоминать запрос, отправлять дальше запрос при помощи wget'а, сказав ему --no-check-certificate, потом, получив ответ, транслировать его с локального сайта.

Но это выглядит как выполнение интеллектуальной работы ради прихоти утилиты, которой нельзя сказать "шотап, секьюрити нес не интересует, работай так!"

Что можно посоветовать в такой ситуации?

А также - не исключено, что я что то не до конца понял...

Спасибо заранее.


Ответы (1 шт):

Автор решения: eri

Установи сертификат касперского в доверенные корневые. Скачать сертификаты:

openssl s_client -showcerts -connect mail.ru:443

Посмотри какой из сертификатов корневой, обычно последний. сохрани в файл

Импортируй в систему

openssl x509 -inform der -in "/tmp/kaspersky-root-ca.crt" -out "/usr/local/share/ca-certificates/kaspersky-root-ca.crt" 
update-ca-certificates 

Если nuget не использует какие-то свои корневые сертификаты, то он берет системные - должен подхватить

→ Ссылка