对 VSIX 包进行签名

扩展程序集在 Visual Studio 中运行前不需要签名,但签名是个好习惯。

为 VSIX 包添加数字签名可确保扩展的安全并防止篡改。 在安装过程中,VSIX 安装程序会显示签名和证书链接。 如果在未更新签名的情况下修改了 VSIX 的内容,安装程序只会警告用户包签名无效。 本指南假定你已创建一个 VSIX

获取代码签名证书

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

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

可使用自颁发证书进行测试。 但是,Visual Studio Marketplace 不接受使用自发证书签署的 VSIX 包。 详细了解使用 .NET CLI 生成自签名证书

使用 Sign CLI 对 VSIX 进行签名

VSIXSignTool 已被弃用,改为使用 Sign CLI (github.com)。 此工具作为 Sign (nuget.org) 下的 dotnet 工具发布到 NuGet,支持本地签名或使用 Azure Key Vault 云签名。

对于本地签名,Sign CLI 支持存储在上述任意位置组合中的证书和私钥:

  • PFXP7BCER 文件
  • 导入 Windows 证书管理器
  • 存储在 USB 设备中,可通过加密服务提供程序 (CSP) 来访问

安装 Sign CLI

  1. 打开开发人员 PowerShell 实例。

  2. 确认 nuget.org 已添加并作为 NuGet 源被启用。

    • 使用 dotnet nuget list source 检查源
    • 使用 dotnet nuget add source -n NuGet.org https://api.nuget.org/v3/index.json 将 NuGet.org 添加为源
  3. 通过运行 dotnet tool install sign --version <version> --global 来安装 Sign,其中 <version>Sign (nuget.org) 下的最新可用版本。

    • --global 是可选项,可将工具安装到 .NET 工具的默认位置,该位置会自动添加到 PATH 环境变量中。

离线安装 Sign CLI

对于独立环境,可以下载最新的 Sign CLI NuGet 包并使用以下命令安装它:

dotnet tool install --global --add-source <path-to-folder> <tool-name> --version <version>

例如:

dotnet tool install --global --add-source D:\NuGetTools sign --version 99.0

使用 Sign CLI

安装后,可使用 sign code <command> <options> 在开发人员 PowerShell 实例中访问 Sign CLI。 有关选项的明细,请参阅 VSIX 包的 Sign CLI 参考

重要

Sign CLI 仅支持 SHA-256SHA-384SHA-512 作为有效的指纹算法。 可以使用 PowerShell 通过以下方法获取指纹:Get-FileHash -Algorithm SHA256 <path to .cer file> | Format-Table -AutoSize

  • 使用带有 SHA-256 指纹的 PFX 文件进行签名:
sign code certificate-store -cfp 80BB567B...52CB95D4C -cf "D:\Certs\f5ec6169345347a7cd2f83af662970d5d0bfc914.pfx" -d "My VSIX Signature" -t "http://timestamp.acs.microsoft.com/" "C:\Users\Contoso\Downloads\FingerSnapper2022.vsix"

注意

PFX 文件包含用于签名的证书和私钥,不符合 C/A 浏览器论坛对扩展验证 (EV) 和非 EV 签名的要求。 建议只使用存储在加固安全模块 (HSM) 设备中的私人密钥,并使用加密服务提供商 (CSP) 来访问它们。

  • 使用 Microsoft 证书管理器和 SHA512 指纹(-csp 选项)进行签名:
sign code certificate-store -cfp A87A60A6F...894559B98 -csp "Microsoft Software Key Storage Provider" -d "VSIX Signature" -t "http://timestamp.acs.microsoft.com/" "C:\Users\Contoso\Downloads\FingerSnapper2022.vsix"
  • 使用 USB 驱动器中的私钥进行签名(-csp 选项):
sign code certificate-store -cfp B113E82D...F5CF294BE0B -csp "eToken Base Cryptographic Provider" -d "VSIX Signature" -t "http://timestamp.acs.microsoft.com/" "C:\Users\Contoso\Downloads\FingerSnapper2022.vsix"
  • 使用特定密钥容器对 USB 驱动器进行签名(-csp 和 -k 选项):
sign code certificate-store -cfp 15BB56B0...1ACB959D0 -csp "eToken Base Cryptographic Provider" -k "NuGet Signing.629c9149345347cd2f83af6f5ec70d5d0a7bf616" -d "VSIX Signature" -t "http://timestamp.acs.microsoft.com/" "C:\Users\Contoso\Downloads\FingerSnapper2022.vsix"