NuGet 签名包验证

可以 对 NuGet 包进行签名 ,使包使用者能够验证包的真实性和完整性。 如果启用了验证,.NET 会在包还原作期间验证已签名的包,在包使用者生成或运行其项目时会自动发生。

NuGet 包签名基于 X.509 证书,签名包验证的先决条件是证书根存储,对代码签名和时间戳都有效。

从 .NET 6.0.400 SDK 开始,NuGet 使用 .NET SDK 中包含的证书捆绑包来验证未提供合适的系统根存储的已签名包。 这些捆绑包源自 Microsoft受信任的根程序 ,并包含与 Windows 上的根存储相同的代码签名和时间戳证书。 这些证书捆绑包应包含验证 来自 NuGet.org 的包所需的所有根证书。

某些 NuGet 命令(如 signverify)始终执行已签名包验证。

每个操作系统的以下部分介绍:

  • 默认情况下,当隐式验证在还原操作期间被启用时。
  • 如何启用它。
  • 哪些根存储被使用。

Windows操作系统

在包恢复操作期间始终启用验证。

NuGet 在 Windows 上使用默认根存储,该存储已支持常规用途代码签名和时间戳。 不使用 .NET SDK 证书捆绑包。 所有已签名包的验证功能在首次引入的 .NET SDK 版本中的 Windows 系统上受到支持。

Linux的

重要

尽管 .NET 5 SDK 中添加了签名包验证功能,但在 .NET 6.0.400 SDK 之前,Linux 上不支持该功能。 不要对低于 6.0.400 的 .NET SDK 版本使用签名包验证。

在 .NET 8 SDK 之前,在包还原作期间默认禁用验证。 若要选择加入,请将环境变量 DOTNET_NUGET_SIGNATURE_VERIFICATION 设置为 true

从 .NET 8 SDK 开始,默认情况下会启用验证。 若要选择退出,请将环境变量 DOTNET_NUGET_SIGNATURE_VERIFICATION 设置为 false

对于代码签名证书验证,NuGet 将首先在以下位置探测证书捆绑包:

/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem

如果找到有效的证书捆绑包,NuGet 将优先于 .NET SDK 的证书捆绑包进行代码签名。 如果它至少包含与 .NET SDK 证书捆绑包相同的根证书集,则 NuGet 签名包验证应成功。 如果缺少根证书(如 NuGet.org 上签名的包中使用的证书),NuGet 签名包验证将失败且状态不受信任(通过 NU3018NU3028)。 将根证书添加到此证书捆绑包可以启用成功的验证;但是,请记住,此证书捆绑包是系统范围的信任存储,而 .NET SDK 证书捆绑包用作应用程序范围的信任存储。

如果在上述位置找不到有效的证书捆绑包,NuGet 将回退到使用 .NET SDK 的证书捆绑包进行代码签名。

对于时间戳证书验证,NuGet 始终使用 .NET SDK 的证书捆绑包进行时间戳。

macOS

默认情况下,在包还原作期间禁用验证。 若要选择加入,请将环境变量 DOTNET_NUGET_SIGNATURE_VERIFICATION 设置为 true。 但是,建议不要启用验证。 有关详细信息,请参阅 NuGet/Home#11985NuGet/Home#11986

NuGet 仅使用 .NET SDK 的证书捆绑包。

重要

尽管 .NET 5 SDK 中添加了签名包验证功能,但 macOS 目前不支持该功能。 不要对低于 6.0.400 的 .NET SDK 版本使用签名包验证。 默认将其禁用。

另请参阅