Manage package trust boundaries

Signed packages don't require any specific action to be installed; however, if the content has been modified since it was signed, the installation is blocked with error NU3008.

Warning

Packages signed with untrusted certificates are considered as unsigned and are installed without any warnings or errors like any other unsigned package.

Configure package signature requirements

Note

Requires NuGet 4.9.0+ and Visual Studio version 15.9 and later on Windows

You can configure how NuGet clients validate package signatures by setting the signatureValidationMode to require in the nuget.config file using the nuget config command.

nuget.exe config -set signatureValidationMode=require
  <config>
    <add key="signatureValidationMode" value="require" />
  </config>

This mode will verify that all packages are signed by any of the certificates trusted in the nuget.config file. This file allows you to specify which authors and/or repositories are trusted based on the certificate's fingerprint.

Trust package author

To trust packages based on the author signature use the trusted-signers command to set the author property in the nuget.config.

nuget.exe  trusted-signers Add -Name MyCompanyCert -CertificateFingerprint CE40881FF5F0AD3E58965DA20A9F571EF1651A56933748E1BF1C99E537C4E039 -FingerprintAlgorithm SHA256
<trustedSigners>
  <author name="MyCompanyCert">
    <certificate fingerprint="CE40881FF5F0AD3E58965DA20A9F571EF1651A56933748E1BF1C99E537C4E039" hashAlgorithm="SHA256" allowUntrustedRoot="false" />
  </author>
</trustedSigners>

Tip

Use the nuget.exe verify command to get the SHA256 value of the certificate's fingerprint.

Trust all packages from a repository

To trust packages based on the repository signature use the repository element:

<trustedSigners>  
  <repository name="nuget.org" serviceIndex="https://api.nuget.org/v3/index.json">
    <certificate fingerprint="0E5F38F57DC1BCC806D8494F4F90FBCEDD988B4676070...." 
                  hashAlgorithm="SHA256" 
                allowUntrustedRoot="false" />
  </repository>
</trustedSigners>

Trust Package Owners

Repository signatures include additional metadata to determine the owners of the package at the time of submission. You can restrict packages from a repository based on a list of owners:

<trustedSigners>  
  <repository name="nuget.org" serviceIndex="https://api.nuget.org/v3/index.json">
    <certificate fingerprint="0E5F38F57DC1BCC806D8494F4F90FBCEDD988B4676070...." 
                  hashAlgorithm="SHA256" 
                allowUntrustedRoot="false" />
      <owners>microsoft;nuget</owners>
  </repository>
</trustedSigners>

If a package has multiple owners, and any one of those owners is in the trusted list, the package installation will succeed.

Untrusted Root certificates

In some situations you may want to enable verification using certificates that do not chain to a trusted root in the local machine. You can use the allowUntrustedRoot attribute to customize this behavior.

Sync repository certificates

Package repositories should announce the certificates they use in their service index. Eventually the repository will update these certificates, e.g. when the certificate expires. When that happens, clients with specific policies will require an update to the configuration to include the newly added certificate. You can easily upgrade the trusted signers associated to a repository by using the nuget.exe trusted-signers sync command.

Schema reference

The complete schema reference for the client policies can be found in the nuget.config reference