dotnet: как грузить nuget-пакеты в случае, если https сломан?
я получил рабочий ноутбук, и попробовал установить туда весь нужный для разработки софт.
Оказалось, что у меня есть Win 10, в которой я "просто user", то есть не могу устанавливать программы и даже запускать программы в обход "белого списка". Но в ней есть wsl2, и там я уже администратор. я довольно легко поставил dotnet core sdk 8.0.
Но когда я выполнил первую команду
dotnet new console
я получил ошибку:
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 шт):
Установи сертификат касперского в доверенные корневые. Скачать сертификаты:
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 не использует какие-то свои корневые сертификаты, то он берет системные - должен подхватить
