Sn.exe (强名称工具)

强名称工具(Sn.exe)可帮助使用 强名称对程序集进行签名。 Sn.exe 提供密钥管理、签名生成和签名验证的选项。

警告

不要依赖强名称来保护安全性。 它们仅提供唯一标识。

有关强命名和强名称程序集的详细信息,请参阅 Strong-Named 程序集 以及如何 :使用强名称对程序集进行签名

强名称工具随 Visual Studio 自动安装。 若要启动该工具,请使用 Visual Studio 开发人员命令提示符或 Visual Studio 开发人员 PowerShell

注释

在 64 位计算机上,使用 Visual Studio 的开发人员命令提示符和 64 位版本的 Visual Studio x64 Win64 命令提示符运行 32 位版本的 Sn.exe。

在命令提示符处,键入以下内容:

Syntax

sn [-quiet][option [parameter(s)]]

参数

选项 Description
-a identityKeyPairFile signaturePublicKeyFile AssemblySignatureKeyAttribute生成数据以将标识密钥从文件迁移到签名密钥。
-ac identityPublicKeyFile identityKeyPairContainer signaturePublicKeyFile AssemblySignatureKeyAttribute生成数据,将数据从密钥容器迁移到签名密钥。
-c [csp] 设置用于强名称签名的默认加密服务提供程序(CSP)。 此设置适用于整个计算机。 如果未指定 CSP 名称,Sn.exe 清除当前设置。
-d container 从强名称 CSP 中删除指定的密钥容器。
-D assembly1 assembly2 验证两个程序集是否仅因签名而异。 这通常用作检查后,程序集已使用不同的密钥对重新签名。
-e assembly outfile 程序集 中提取公钥并将其存储在 传出文件中。
-h 显示该工具的命令语法和选项。
-i infile container 从指定密钥容器中的 文件 安装密钥对。 密钥容器驻留在强名称 CSP 中。
-k [keysize] outfile 生成指定大小的新 RSACryptoServiceProvider 键,并将其写入指定文件。 公钥和私钥都写入文件。

如果未指定密钥大小,则如果安装了Microsoft增强加密提供程序,则默认生成 1,024 位密钥;否则,将生成 512 位密钥。

如果安装了Microsoft增强的加密提供程序, 则 keysize 参数支持从 384 位到 16,384 位的密钥长度(增量为 8 位)。 如果安装了Microsoft基本加密提供程序,它支持密钥长度从 384 位增加到 512 位(以 8 位为单位)。
-m [y or n] 指定密钥容器是特定于计算机还是特定于用户。 如果指定 y,则密钥容器特定于计算机。 如果指定 n,则密钥容器特定于用户。

如果未指定 y 或 n,则此选项将显示当前设置。
-o infile [outfile] 文件 中提取公钥,并将其存储在 .csv 文件中。 逗号分隔公钥的每个字节。 此格式对于在源代码中将键的硬编码引用作为初始化数组进行硬编码非常有用。 如果未指定 输出文件,此选项会将输出放在剪贴板上。 注意: 此选项不验证输入是否只是公钥。 infile如果包含具有私钥的密钥对,则还会提取私钥。
-p infile outfile [hashalg] 文件中 的密钥对中提取公钥,并将其存储在 文件外,可以选择使用 hashalg 指定的 RSA 算法。 此公钥可用于使用程序集链接器 (Al.exe)/delaysign+/keyfile 选项延迟对程序集进行签名。 当程序集延迟签名时,在编译时仅设置公钥,并在文件中保留空间,以便在已知私钥时添加签名。
-pc container outfile [hashalg] 容器 中的密钥对中提取公钥,并将其存储在 文件外。 如果使用 hashalg 选项,则 RSA 算法用于提取公钥。
-Pb [y or n] 指定是否强制实施强名称绕过策略。 如果指定 y,则加载到完全信任状态时,不会验证完全信任 AppDomain程序集的强名称。 如果指定 n,则强名称将验证为正确性,但不验证特定强名称。 这 StrongNameIdentityPermission 不会影响完全信任程序集。 必须对强名称匹配执行自己的检查。

如果两者 y 均未指定或 n 未指定,则此选项将显示当前设置。 默认值为 y注意: 在 64 位计算机上,必须在 32 位和 64 位 Sn.exe实例中设置此参数。
-q[uiet] 指定静默模式;禁止显示成功消息。
-R[a] assembly infile 使用 文件中的密钥对重新签名以前签名或延迟签名的程序集。

如果使用 -Ra ,则为程序集中的所有文件重新计算哈希。
-Rc[a] assembly container 使用 容器中的密钥对重新签名以前签名或延迟签名的程序集。

如果使用 -Rca ,则为程序集中的所有文件重新计算哈希。
-Rh assembly 重新计算程序集中所有文件的哈希。
-t[p] infile 显示存储在 文件中的公钥的令牌。 文件的内容必须是以前使用 -p 从密钥对文件生成的公钥。 请勿使用 -t[p] 选项直接从密钥对文件中提取令牌。

Sn.exe 使用公钥中的哈希函数计算令牌。 为了节省空间,公共语言运行时在清单中存储公钥令牌,作为对另一个程序集的引用的一部分,当它记录具有强名称的程序集的依赖项时。 -tp 选项除了显示令牌之外,还显示公钥。 AssemblySignatureKeyAttribute如果属性已应用于程序集,则令牌用于标识密钥,并显示哈希算法的名称和标识密钥。

请注意,此选项不验证程序集签名,不应用于做出信任决策。 此选项仅显示原始公钥令牌数据。
-T[p] assembly 显示程序集的公钥令牌程序集必须是包含程序集清单的文件的名称。

Sn.exe 使用公钥中的哈希函数计算令牌。 为了节省空间,运行时在清单中存储公钥令牌,作为对另一个程序集的引用的一部分,当它记录具有强名称的程序集的依赖项时。 除了令牌之外, -Tp 选项还显示公钥。 AssemblySignatureKeyAttribute如果属性已应用于程序集,则令牌用于标识密钥,并显示哈希算法的名称和标识密钥。

请注意,此选项不验证程序集签名,不应用于做出信任决策。 此选项仅显示原始公钥令牌数据。
-TS assembly infile 使用密钥对在文件中对已签名或部分签名的程序集进行测试签名。
-TSc assembly container 使用密钥容器容器容器中的密钥对已签名或部分签名的程序集进行测试签名。
-v assembly 验证 程序集中的强名称,其中 程序集 是包含程序集清单的文件的名称。
-vf assembly 验证程序集中的强名称 -v 选项不同, -vf 强制验证,即使使用 -Vr 选项禁用。
-Vk regfile.reg assembly [userlist] [infile] 创建注册条目(.reg)文件,可用于注册指定的程序集进行验证跳过。 适用于 -Vr 选项的程序集命名规则也适用于 -Vk 。 有关 用户列表文件 选项的信息,请参阅 -Vr 选项。
-Vl 列出此计算机上的强名称验证的当前设置。
-Vr assembly [userlist] [infile] 注册 程序集 以跳过验证。 (可选)可以指定跳过验证应应用于的用户名的逗号分隔列表。 如果指定 了文件,验证将保持启用状态,但在验证作中使用 了文件中的 公钥。 可以使用 *, strongname 格式指定程序集,以使用指定的强名称注册所有程序集。 对于 strongname,请指定表示公钥的标记化形式的十六进制数字字符串。 请参阅 -t-T 选项以显示公钥令牌。 谨慎: 仅在开发过程中使用此选项。 将程序集添加到跳过验证列表会创建安全漏洞。 恶意程序集可以使用添加到跳过验证列表的程序集的完全指定的程序集名称(程序集名称、版本、区域性和公钥令牌)来伪造其标识。 这将允许恶意程序集也跳过验证。
-Vu assembly 取消注册 程序集 以跳过验证。 适用于 -Vr 的程序集命名规则同样适用于 -Vu
-Vx 删除所有验证跳过的条目。
-? 显示该工具的命令语法和选项。

注释

所有 Sn.exe 选项都区分大小写,必须完全按工具所示键入。

注解

-R-Rc 选项对已延迟签名的程序集非常有用。 在此方案中,在编译时仅设置公钥,稍后在已知私钥时执行签名。

注释

对于写入受保护资源(如注册表)的参数(例如 -Vr), 请以管理员身份运行 SN.exe。

强名称工具假定使用算法标识符生成 AT_SIGNATURE 公钥/私钥对。 使用 AT_KEYEXCHANGE 算法生成的公钥/私钥对将生成错误。

例子

以下命令创建一个新的随机密钥对并将其存储在其中 keyPair.snk

sn -k keyPair.snk

以下命令将密钥 keyPair.snk 存储在强名称 CSP 的容器 MyContainer 中。

sn -i keyPair.snk MyContainer

以下命令从 keyPair.snk 中提取公钥并将其存储在其中 publicKey.snk

sn -p keyPair.snk publicKey.snk

以下命令显示公钥和包含在其中的 publicKey.snk公钥的令牌。

sn -tp publicKey.snk

以下命令验证程序集 MyAsm.dll

sn -v MyAsm.dll

以下命令从默认 CSP 中删除 MyContainer

sn -d MyContainer

另请参阅