Проверка подписанного пакета NuGet
Вы можете подписать пакет NuGet, чтобы разрешить потребителям пакетов проверить подлинность и целостность пакета. Если проверка включена, .NET проверяет подписанные пакеты во время операции восстановления пакета, которая возникает автоматически при сборке или запуске проекта потребителя пакета.
Подписи пакетов NuGet основаны на сертификатах X.509, и необходимое условие для проверки подписанного пакета — это корневое хранилище сертификатов, допустимое как для подписывания кода, так и метки времени.
Начиная с пакета SDK для .NET 6.0.400 NuGet использует пакеты сертификатов, включенные в пакет SDK для .NET, чтобы проверить, где подходящее корневое хранилище системы недоступно. Эти пакеты создаются из доверенной корневой программы Майкрософт и содержат те же сертификаты подписи кода и метки времени, что и корневое хранилище в Windows. Эти пакеты сертификатов должны содержать все корневые сертификаты, необходимые для проверки пакетов из NuGet.org.
Некоторые команды NuGet, например sign
и verify
всегда выполняют проверку подписанного пакета.
В следующих разделах для каждой операционной системы описано:
- Если неявная проверка во время операций восстановления включена по умолчанию.
- Как включить его.
- Какие корневые хранилища используются.
Windows
Проверка всегда включена во время операций восстановления пакета.
NuGet использует корневое хранилище по умолчанию в Windows, которое уже поддерживает подписывание кода общего назначения и метку времени. Пакеты сертификатов sdk для .NET не используются. Все функции проверки подписанного пакета поддерживаются в Windows в версии пакета SDK для .NET, в которой она появилась.
Linux
Внимание
Хотя функция проверки подписанного пакета добавлена в пакет SDK для .NET 5, эта функция не поддерживается в Linux до пакета SDK для .NET 6.0.400. Не используйте проверку подписанного пакета с версиями пакета SDK для .NET до версии 6.0.400.
До пакета SDK для .NET 8 проверка отключена по умолчанию во время операций восстановления пакета. Чтобы принять участие, задайте для переменной DOTNET_NUGET_SIGNATURE_VERIFICATION
среды значение true
.
Начиная с пакета SDK для .NET 8 проверка включена по умолчанию. Чтобы отказаться, задайте для переменной DOTNET_NUGET_SIGNATURE_VERIFICATION
среды значение false
.
Для проверки сертификата подписывания кода NuGet сначала проверит пакет сертификатов в следующем расположении:
/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
Если найден допустимый пакет сертификатов, NuGet предпочтет его пакету сертификатов пакета SDK для .NET для подписывания кода. Если он содержит по крайней мере тот же набор корневых сертификатов, что и пакет сертификатов пакета SDK для .NET, то проверка подписанного пакета NuGet должна завершиться успешно. Если в NuGet.org отсутствуют корневые сертификаты, такие как те, которые используются в подписанных пакетах, проверка подписанного пакета NuGet завершится ошибкой с ненадежным состоянием (через NU3018 или NU3028). Добавление корневых сертификатов в этот пакет сертификатов может включить успешную проверку; Однако помните, что этот пакет сертификатов является хранилищем доверия на уровне системы, в то время как пакеты sdk для .NET используются в качестве хранилища доверия на уровне приложений.
Если допустимый пакет сертификатов не найден в приведенном выше расположении, NuGet вернется к использованию пакета сертификатов пакета SDK для .NET для подписывания кода.
Для проверки сертификата метки времени NuGet всегда использует пакет сертификатов пакета SDK для .NET для метки времени.
macOS
Проверка отключена по умолчанию во время операций восстановления пакета. Чтобы принять участие, задайте для переменной DOTNET_NUGET_SIGNATURE_VERIFICATION
среды значение true
. Однако рекомендуется не включить проверку подлинности. Дополнительные сведения см. в разделе NuGet/Home#11985 и NuGet/Home#11986.
NuGet использует только пакеты сертификатов пакета SDK для .NET.
Внимание
Хотя в пакете SDK для .NET 5 добавлена функция проверки подписанного пакета, функция в настоящее время не поддерживается в macOS. Не используйте проверку подписанного пакета с версиями пакета SDK для .NET до версии 6.0.400. Оставьте его отключенным по умолчанию.