签名包允许进行内容完整性验证检查,从而防止内容篡改。 包签名还作为有关包实际来源的单一真实来源,并增强了使用者对包真实性的信任。 本指南假定你已经 创建了一个包。
获取代码签名证书
可以从公共证书颁发机构获取有效的证书,例如:
也可从 http://aka.ms/trustcertpartners中获取 Windows 信任的证书颁发机构的完整列表。
可以使用自颁发的证书进行测试。 但是,NuGet.org 不接受使用自颁发证书签名的包。详细了解如何 创建测试证书
导出证书文件
可以使用证书导出向导将现有证书导出到二进制 DER 格式。
还可以使用 Export-Certificate PowerShell 命令导出证书。
对包进行签名
使用 dotnet nuget 签名对包进行签名 (需要 .NET 6.0.100 SDK 或更高版本)。
dotnet nuget sign MyPackage.nupkg --certificate-path <PathToTheCertificate> --timestamper <TimestampServiceURL>
或
使用 nuget 签名 对包进行签名(需要 nuget.exe 4.6.0 或更高版本):
nuget sign MyPackage.nupkg -CertificatePath <PathToTheCertificate> -Timestamper <TimestampServiceURL>
小窍门
证书提供程序通常还提供时间戳服务器 URL,可用于上面所示的 Timestamper 可选参数。 请查阅提供商的文档和/或对该服务 URL 的支持。
- 可以使用证书存储中提供的证书,也可以使用文件中的证书。 请参阅 nuget sign 的 CLI 参考。
- 签名包应包含时间戳,以确保签名在签名证书过期时保持有效。 否则,取符号操作将生成警告。
- 可以使用 nuget 验证查看给定包的签名详细信息。
在 NuGet.org 上注册证书
若要发布已签名的包,必须先向 NuGet.org 注册证书。需要以二进制 DER 格式将证书作为 .cer 文件。
- 登录到 NuGet.org。
- 转到
Account settings(或者Manage Organization>Edit Organization,如果你想使用组织帐户注册证书)。 - 展开该
Certificates部分,然后选择Register new。 - 浏览并选择之前导出的证书文件。
注释
- 一个用户可以提交多个证书,同一个证书可由多个用户注册。
- 用户注册证书后,所有将来的包提交 都必须 使用其中一个证书进行签名。 请参阅 在 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 上管理包的签名要求
登录到 NuGet.org。
转到
Manage Packages
”
如果您是包的唯一所有者,则您是必须的签名者,也就是说,您可以使用任何已注册的证书对您的包进行签名并发布到 NuGet.org。
如果包具有多个所有者,则默认情况下,可以使用“Any”所有者的证书对包进行签名。 作为包的共同所有者,你可以将“任何”替换为你自己或其他任何共同所有者,成为指定的签名者。 如果您创建一个没有任何证书注册的所有者,则将允许未签名的软件包。
同样,如果选择了默认的“任何”选项,并且一个所有者有注册的证书而另一个没有注册任何证书,那么 NuGet.org 可以接受一个由其中一个所有者注册签名的签名包,或者接受未签名的包(因为其中一个所有者未注册任何证书)。