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 证书捆绑包。 Windows 上引入签名包验证功能的 .NET SDK 版本支持所有签名包验证功能。

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 版本使用签名包验证。 默认将其禁用。

另请参阅