已签名的包

NuGet 4.6.0 及以上版本和 Visual Studio 2017 版本 15.6 及更高版本

NuGet 包可包含一个数字签名,它可防止篡改内容。 此签名从 X.509 证书生成,而该证书还会向包的实际来源添加真实性证明。

已签名的包提供最强大的端到端验证。 有两种不同类型的 NuGet 签名:

  • 作者签名。 作者签名可保证包自作者对包签名后未对包进行任何修改,而无论包来自哪个存储库或使用哪个传输方法来提供。 此外,作者签名的包可为 nuget.org 发布管道提供额外的身份验证机制,因为签名证书必须提前进行注册。 有关详细信息,请参阅注册证书
  • 存储库签名。 存储库签名可为存储库中的所有包提供完整性保证,而无论它们是作者已签名还是未签名,且即使这些包是从与原始存储库(在其中对这些包进行签名)不同的其他位置获取的。

有关创建作者签名包的详细信息,请参阅对包签名nuget sign 命令。 可使用 dotnet nuget verifynuget verify 命令来验证包的签名。

重要

目前,仅 Windows 上的 nuget.exe 支持创作签名包。 但是,上传到 nuget.org 的所有包均会自动进行存储库签名。

证书要求

包签名需要代码签名证书。该证书是一种特殊类型的证书,它适用于 id-kp-codeSigning 用途 [RFC 5280 第 4.2.1.1.12 节]。 此外,证书必须具有 2,048 位或更高位数的 RSA 公钥长度。

时间戳要求

已签名的包应包含 RFC 3161 时间戳,以确保超出包签名证书的有效期时的签名有效性。 用于对时间戳进行签名的证书必须符合 id-kp-timeStamping 用途 [RFC 5280 第 4.2.1.12 节]。 此外,证书必须具有 2,048 位或更高位数的 RSA 公钥长度。

可在包签名技术规范 (GitHub) 中找到其他技术详细信息。

NuGet.org 上的签名要求

nuget.org 对接受已签名包存在其他要求:

  • 主签名必须为作者签名。
  • 主签名必须具有有效的时间戳。
  • 针对作者签名及其时间戳签名的 X.509 证书:
    • 必须具有 2,048 位或更长长度的 RSA 公钥。
    • 必须处于在 nuget.org 上进行包验证时按当前 UTC 时间来计算的有效期内。
    • 必须链接到默认在 Windows 上受信任的根证书颁发机构。 使用自颁发证书来签名的包将被拒绝。
    • 必须符合其用途:
      • 作者签名证书必须对代码签名有效。
      • 时间戳证书必须对时间戳添加有效。
    • 不得在签名时吊销。 (提交时可能不知道此情况,因此 nuget.org 会定期重新检查吊销状态)。