Bug 49566 - .NET 8: Не устанавливаются пакеты из NuGet в связи с отсутствием доверия к 2 корневым сертификатам
Summary: .NET 8: Не устанавливаются пакеты из NuGet в связи с отсутствием доверия к 2 ...
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: dotnet-8.0 (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Vitaly Lipatov
QA Contact: qa-sisyphus
URL: https://learn.microsoft.com/ru-ru/dot...
Keywords:
Depends on:
Blocks:
 
Reported: 2024-02-29 16:26 MSK by Artem Varaksa
Modified: 2024-03-01 13:32 MSK (History)
1 user (show)

See Also:


Attachments
Вывод $ dotnet add package Newtonsoft.Json (11.81 KB, text/plain)
2024-02-29 16:26 MSK, Artem Varaksa
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Varaksa 2024-02-29 16:26:04 MSK
Created attachment 15630 [details]
Вывод $ dotnet add package Newtonsoft.Json

Шаги
====

1. # apt-get install -y dotnet-8.0
2. $ dotnet new web -o webapp
3. $ cd webapp
4. $ dotnet add package Newtonsoft.Json

Фактический результат
=====================

Ошибки вида (полный лог см. во вложении):

> info : X.509 certificate chain validation will use the system certificate bundle at '/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem'.
> info : X.509 certificate chain validation will use the fallback certificate bundle at '/usr/lib64/dotnet/sdk/8.0.102/trustedroots/timestampctl.pem'.
> [...]
> warn : NU3042: Package 'Newtonsoft.Json 13.0.3' from source 'https://api.nuget.org/v3/index.json': The following X.509 root certificate is untrusted because it is not present in the certificate bundle at /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem. For more information, see documentation for NU3042.
> [...]
> warn : Subject: CN=DigiCert CS RSA4096 Root G5, O="DigiCert, Inc.", C=US
> warn : Fingerprint (SHA-256): 7353B6D6C2D6DA4247773F3F07D075DECB5134212BEAD0928EF1F46115260941
> [...]

В /usr/lib64/dotnet/sdk/8.0.102/trustedroots/timestampctl.pem (как и в аналогичном файле для 7.0) искомые сертификаты есть. Возможно, проблема в том, что этот fallback не работает с .NET 8?

В системном хранилище доверия этих сертификатов нет (# trust-list).

Странно, что в конце вывода другая ошибка:

> error: Value cannot be null. (Parameter 'path1')

(последующий вывод справки об использовании - известная ошибка https://github.com/NuGet/Home/issues/13251)

Тем не менее, если установить переменную среды DOTNET_NUGET_SIGNATURE_VERIFICATION=false, то установка работает, что указывает на проблему именно с сертификатами.

Ожидаемый результат
===================

Успешное добавление пакета, как с .NET 6 и 7.

Дополнительно
=============

Сертификаты:
- https://crt.sh/?q=7353B6D6C2D6DA4247773F3F07D075DECB5134212BEAD0928EF1F46115260941
- https://crt.sh/?q=3E9099B5015E8F486C00BCEA9D111EE721FABA355A89BCF1DF69561E3DC6325C

Возможно, связанная ошибка:
- https://github.com/NuGet/Home/issues/12033

Информация об ошибках NuGet:
- https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3042
- https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3018

Воспроизводимость
=================

Воспроизводится на виртуальной машине:

[sisyphus] ALT Server 10.1 x86_64
dotnet-8.0-8.0.2-alt1.x86_64

В p10 .NET 8 ещё нет.
Comment 1 Vitaly Lipatov 2024-02-29 18:01:23 MSK
Проблема воспроизводится при наличии файла
/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
откуда он у вас в системе?
Comment 2 Artem Varaksa 2024-02-29 18:04:35 MSK
(Ответ для Vitaly Lipatov на комментарий #1)
> Проблема воспроизводится при наличии файла
> /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
> откуда он у вас в системе?

> # rpm -qf /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
> ca-trust-0.1.4-alt1.noarch

Пакет присутствует во всех дистрибутивах p10 https://packages.altlinux.org/ru/p10/srpms/ca-trust/images/?task_repo=p10.
Comment 3 Artem Varaksa 2024-02-29 18:05:29 MSK
(Ответ для Artem Varaksa на комментарий #2)
> > ca-trust-0.1.4-alt1.noarch

В sisyphus 0.1.5-alt1.
Comment 4 Vitaly Lipatov 2024-03-01 02:56:09 MSK
Насколько я понял логику поиска, при существовании файла /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem уже не будет принят в расчёт /usr/lib64/dotnet/sdk/8.0.102/trustedroots/timestampctl.pem

Ещё более странно то, что не упоминается файл
/usr/lib64/dotnet/sdk/8.0.102/trustedroots/codesignctl.pem

который по логике и должен использоваться для проверки подписи.

Так вот, при отсутствии файла /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem

Надпись такая:

info : X.509 certificate chain validation will use the fallback certificate bundle at '/usr/lib64/dotnet/sdk/8.0.102/trustedroots/codesignctl.pem'.
info : X.509 certificate chain validation will use the fallback certificate bundle at '/usr/lib64/dotnet/sdk/8.0.102/trustedroots/timestampctl.pem'.

то есть system certificate bundle уже нет, зато не потерялся codesignctl.pem

В общем, код такой в 
NuGet.Client/src/NuGet.Core/NuGet.Packaging/Signing/TrustStore/X509TrustStore.cs

        public static void InitializeForDotNetSdk(ILogger logger)
        {
            _ = GetX509ChainFactory(X509StorePurpose.CodeSigning, logger, CreateX509ChainFactoryForDotNetSdk);
            _ = GetX509ChainFactory(X509StorePurpose.Timestamping, logger, CreateX509ChainFactoryForDotNetSdk);
        }

А каждый CreateX509ChainFactoryForDotNetSdk возвращает успех, если найдено системное хранилище и использует только его!
Comment 5 Vitaly Lipatov 2024-03-01 03:07:29 MSK
(Ответ для Artem Varaksa на комментарий #0)
...
> > info : X.509 certificate chain validation will use the system certificate bundle at '/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem'.
.. 
> В системном хранилище доверия этих сертификатов нет (# trust-list).
...
> https://crt.sh/
> ?q=7353B6D6C2D6DA4247773F3F07D075DECB5134212BEAD0928EF1F46115260941
> -
> https://crt.sh/
> ?q=3E9099B5015E8F486C00BCEA9D111EE721FABA355A89BCF1DF69561E3DC6325C
> 

Если у вас в системе есть файл /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem, то заполните его нужными сертификатами, чтобы nuget мог проверять подписи, или удалите этот пустой файл, если он не используется.
Comment 6 Vitaly Lipatov 2024-03-01 03:17:04 MSK
«…в следующем расположении: /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem Если найден допустимый пакет сертификатов, NuGet предпочтет его пакету сертификатов пакета SDK для .NET для подписывания кода.»

https://learn.microsoft.com/ru-ru/dotnet/core/tools/nuget-signed-package-verification

Можно подключиться к
Программе доверенных корневых сертификатов Майкрософт
https://learn.microsoft.com/ru-ru/security/trusted-root/program-requirements
Comment 7 Vitaly Lipatov 2024-03-01 13:32:15 MSK
Добавил пакет с нужными сертификатами
ca-certificates-nuget.org.git=0.1-alt1
и зависимость на него в
dotnet-sdk-8.0.git=8.0.102-alt2