Подписать пакет NuGet

Подписанный пакет позволяет проверять целостность содержимого, что обеспечивает защиту от изменения содержимого. Подпись пакета также служит единственным источником истины о фактическом происхождении пакета и повышает подлинность пакета для потребителя. В этом руководстве предполагается, что вы уже создали пакет.

Получение сертификата подписи кода

Допустимые сертификаты можно получить из общедоступного центра сертификации, например:

Полный список доверенных центров сертификации Windows также можно получить из http://aka.ms/trustcertpartners.

Для тестирования можно использовать самоподписанные сертификаты. Однако пакеты, подписанные с помощью самозадаемых сертификатов, не принимаются NuGet.org. Дополнительные сведения о создании тестового сертификата

Экспорт файла сертификата

  • Если сертификат хранится в аппаратном маркере, не следует экспортировать сертификат. Вместо этого укажите отпечатки сертификатов семейства SHA-2 (отпечатки пальцев) с использованием параметра --certificate-fingerprint <SHA-2fingerprint> (заменяя --certificate-path <PathToTheCertificate>)

  • Существующий сертификат можно экспортировать в двоичный формат DER с помощью мастера экспорта сертификатов.

    Мастер экспорта сертификатов

  • Вы также можете экспортировать сертификат с помощью команды PowerShellExport-Certificate.

Подписывание пакета

Подпишите пакет с помощью dotnet nuget sign (требуется .NET SDK версии 6.0.100 или более поздней).

dotnet nuget sign MyPackage.nupkg --certificate-path <PathToTheCertificate> --timestamper <TimestampServiceURL>

или

Подпишите пакет с помощью nuget sign (требуется nuget.exe версии 4.6.0 или более поздней версии).

nuget sign MyPackage.nupkg -CertificatePath <PathToTheCertificate> -Timestamper <TimestampServiceURL>

Подсказка

Поставщик сертификатов часто предоставляет URL-адрес сервера метки времени, который можно использовать для приведенного выше необязательного Timestamper аргумента. Обратитесь к документации поставщика и /или поддержке этого URL-адреса службы.

  • Вы можете использовать сертификат, доступный в хранилище сертификатов, или использовать сертификат из файла. См. справочник CLI по команде nuget sign.
  • Подписанные пакеты должны содержать метку времени, чтобы убедиться, что подпись остается допустимой при истечении срока действия сертификата подписи. Иначе операция знака создаст предупреждение.
  • С помощью nuget verify можно просмотреть информацию о подписи указанного пакета.

Регистрация сертификата в NuGet.org

Чтобы опубликовать подписанный пакет, необходимо сначала зарегистрировать сертификат с помощью NuGet.org. Вам нужен сертификат в виде .cer файла в двоичном формате DER.

  1. Войдите в NuGet.org.
  2. Перейдите к Account settings (или Manage Organization>Edit Organization, если вы хотите зарегистрировать сертификат с учетной записью организации).
  3. Certificates Разверните раздел и выберите Register new.
  4. Найдите и выберите экспортируемый ранее файл сертификатов. Зарегистрированные сертификаты

Замечание

  • Один пользователь может отправить несколько сертификатов и один и тот же сертификат можно зарегистрировать несколькими пользователями.
  • Хотя у пользователя зарегистрирован один или несколько сертификатов, все отправки пакетов должны быть подписаны одним из сертификатов. См. Инструкции по управлению требованиями к подписи для вашего пакета на сайте NuGet.org
  • Пользователи также могут удалить зарегистрированный сертификат из учетной записи. После удаления сертификата отправка новых пакетов, подписанных этим сертификатом, завершится неудачей. Существующие пакеты не затрагиваются.

Публикация пакета

Теперь вы готовы опубликовать пакет в NuGet.org. См. статью "Публикация пакетов".

Создание тестового сертификата

Для тестирования можно использовать самоподписанные сертификаты. Чтобы создать самозаверяющийся сертификат, используйте команду New-SelfSignedCertificate PowerShell.

New-SelfSignedCertificate -Subject "CN=NuGet Test Developer, OU=Use for testing purposes ONLY" `
                          -FriendlyName "NuGetTestDeveloper" `
                          -Type CodeSigning `
                          -KeyUsage DigitalSignature `
                          -KeyLength 2048 `
                          -KeyAlgorithm RSA `
                          -HashAlgorithm SHA256 `
                          -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" `
                          -CertStoreLocation "Cert:\CurrentUser\My" 

Эта команда создает сертификат тестирования, доступный в личном хранилище сертификатов текущего пользователя. Вы можете открыть хранилище сертификатов, выполнив команду certmgr.msc , чтобы просмотреть только что созданный сертификат.

Предупреждение

NuGet.org не принимает пакеты, подписанные самостоятельно выданными сертификатами.

Управление требованиями к подписи пакета на NuGet.org

  1. Войдите в NuGet.org.

  2. Перейдите к разделу Manage Packages

  • Если вы являетесь единственным владельцем пакета, вы являетесь обязательным подписчиком, то есть вы можете использовать любой из зарегистрированных сертификатов для подписывания и публикации пакетов в NuGet.org.

  • Если у пакета несколько владельцев, то по умолчанию сертификаты любого владельца могут быть использованы для подписи пакета. В качестве совладельца пакета вы можете переопределить "Любой" на себя или любого другого совладельца, чтобы быть обязательным подписантом. Если вы создаете владельца, у которого нет зарегистрированного сертификата, то будут допущены неподписанные пакеты.

  • Аналогичным образом, если для пакета выбран параметр "Любой" по умолчанию, и один из владельцев имеет зарегистрированный сертификат, а у другого владельца сертификат не зарегистрирован, то NuGet.org принимает либо подписанный пакет с подписью, зарегистрированной одним из владельцев, либо неподписанный пакет (поскольку один из владельцев не имеет зарегистрированного сертификата).