签署 NuGet 包

已签名的包允许进行内容完整性验证检查,可有效防止内容被篡改。 此外,包的签名还可作为包的实际来源的单一可信来源,增强了对包使用者的身份验证。 本指南假定你已创建一个包

获取代码签名证书

可以从公共证书颁发机构获取有效的证书,例如:

还可从 http://aka.ms/trustcertpartners 获取 Windows 信任的证书颁发机构完整列表。

可使用自颁发证书进行测试。 但是,NuGet.org 不接受使用自颁发证书签名的包。了解有关创建测试证书的详细信息

导出证书文件

对包进行签名

使用 dotnet nuget sign 对包进行签名(需要 .NET 6.0.100 SDK 或更高版本)。

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。你需要将证书作为二进制 DER 格式的 .cer 文件。

  1. 登录到 NuGet.org。
  2. 转到 Account settings(如果希望使用组织帐户注册证书,则转到 Manage Organization>Edit Organization)。
  3. 展开 Certificates 部分,并选择 Register new
  4. 浏览并选择前面导出的证书文件。 Registered Certificates

注意

  • 一个用户可以提交多个证书并且多个用户可以注册同一个证书。
  • 用户注册证书之后,所有未来的包提交都必须使用其中一个证书进行签名。 请参阅管理 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 PackagesConfigure package signers

  • 如果你是包的唯一所有者,那么你就是所要求的签名者,即你可使用任何已注册的证书对包进行签名,然后将其发布到 NuGet.org。

  • 如果包具有多个所有者,默认情况下,可以使用“任何”所有者的证书对包进行签名。 作为包的共同所有者,你可将“任何”重写为你自己或任何其他共同所有者,作为所需的签名者。 如果你让没有注册任何证书的人成为所有者,则将允许未签名的包。

  • 同样,如果已选中某个包的默认“任何”选项,在该包中,有一个所有者已注册证书,而另一个所有者未注册任何证书,则 NuGet.org 接受已签名的包(由其中一个所有者注册签名)或接受未签名的包(因为其中一个所有者未注册任何证书)。