我需要创建post build事件来执行以下操作:
sn -i MyKey.pfx MyKeyContainerName
tlbimp $(ConfigurationName)\MyCom.tlb /out:$(ConfigurationName)\NETMyCom.dll /keycontainer:MyKeyContainerName
sn -d MyKeyContainerName
Run Code Online (Sandbox Code Playgroud)
当Visual Studio执行第一个语句时,它需要一个密码并等待用户指定并失败.
Microsoft(R).NET Framework强名称实用程序版本2.0.50727.42版权所有(c)Microsoft Corporation.版权所有.
输入PKCS#12密钥文件的密码:无法解析mykey.pfx中的PKCS#12 blob - 句柄无效.
我尝试使用sn命令行参数指定密码,但我看不到这样做的方法.
请帮忙.
此致,希尔米.
不幸的是,这里提到的方法对我没有用。我必须在 docker 容器中注册几个 pfxs。
因此,我sn.exe -i <infile> <container>使用RSACryptoServiceProvider在 C# 中重新开发了该
命令。源代码和应用程序位于 GitHub 的SnInstallPfx项目中。
该SnInstallPfx应用程序接受一个PFX密钥和密码。它会自动计算密钥容器名称 (VS_KEY_*)(从 MSBuild 源代码中借用)并将其安装到强名称 CSP。
用法:
SnInstallPfx.exe <pfx_infile> <pfx_password>
Run Code Online (Sandbox Code Playgroud)
如果像我一样,您没有使用 TFS 或 MSBUILD 来构建,那么至少还有其他 2 种方法:
a) 从脚本运行 sn.exe,并将密码写入 stdin
请参阅此处的 C# 示例:
注意:使用 .NET4 版本的 sn.exe 似乎不可能将其作为外部进程执行(至少在 Windows XP 上),并将密码写入标准输入(我尝试使用 python + 和 C#,sn.exe 似乎直接退出而不等待密码输入)。
b) 使用 sn.exe 使用已安装的 pfx 重新签名密码。
如果您已经安装了 pfx 文件,那么您可能知道容器名称(通常 Visual Studio 使用类似 VS_KEY_ABAB1234ABAB1234 之类的名称)
如果像我一样,您不知道或记住容器名称,则只需重新安装 pfx 文件:
sn -i myPfxFile VS_KEY_ABAB1234ABAB1234
Run Code Online (Sandbox Code Playgroud)
sn.exe 将提示您输入密码,因为它将证书安装在 pfx 文件中。
然后,您可以让 sn.exe 重新签署您的程序集,而不会提示输入密码:
sn -Rca myAssembly.dll myVSkey
Run Code Online (Sandbox Code Playgroud)
上面的内容可以在构建脚本中使用,因为不需要交互:-)
请注意,请记住检查签名是否确实有效:
sn -v myAssembly.dll
Run Code Online (Sandbox Code Playgroud)