sn.exe可以使用Windows证书存储区吗?

时间:2009-06-15 17:44:39

标签: .net .net-2.0 code-signing strongname sn.exe

要在.NET中使用sn.exe对程序集进行签名,是否可以指定仅在Windows CryptoAPI密钥库中包含私钥的公钥?

我看到了指定CSP名称和容器名称的选项。

是否有用于访问Windows证书的值? (即可从Windows EFS,Outlook,Internet Explorer等访问的那些)

谢谢。

评论:具体来说,我问这个是因为有几个键没有将私钥标记为可导出,所以我无法导出.pfx并遵循该路由。

1 个答案:

答案 0 :(得分:-1)

本周末,我有同样的问题。

,可以将其配置为使用Windows证书存储区,如果您确实具有安全意识,则绝对执行此操作。这使得很难意外泄露私钥(如果你使用像Yubikey这样的智能卡,它就不可能泄露私钥 - 操作系统永远不会泄露它。)

我在two different中记录了如何执行此操作,但在博客上的帖子中提供了相关的方式。

如果您只是在个人证书存储区中使用证书,但未使用智能卡,则相对容易。

在PowerShell中,您需要获取证书的详细信息:

Set-Location "cert:\Path\To\Your\Certificate"
# Usually "cert:\CurrentUser\My" is what you want
$cert=Get-Item ".\(your-certificate-thumbprint)"

您需要确定用于访问该密钥容器的密钥容器名称和CSP(如果它不是智能卡,则默认CSP可用)

$cert=Get-Item .\(ThumbprintOfYourKey)
$cert.PrivateKey.CspKeyContainerInfo | fl *

这将产生类似于以下内容的内容:

MachineKeyStore        : False
ProviderName           : Microsoft Base Smart Card Crypto Provider
ProviderType           : 1
KeyContainerName       : c0f031c2-0b5e-171b-d552-fab7345fc10a
UniqueKeyContainerName : c0f031c2-0b5e-171b-d552-fab7345fc10a
KeyNumber              : Signature
Exportable             : False
HardwareDevice         : True
Removable              : True
Accessible             : True
Protected              : True
CryptoKeySecurity      : System.Security.AccessControl.CryptoKeySecurity
RandomlyGenerated      : False

就我而言,我使用的是Yubikey,因此CSP是“Microsoft Base Smart Card Crypto Provider”。这意味着为了强名称签署我的代码,我需要运行:

sn.exe -c "Microsoft Base Smart Card Crypto Provider"

在我构建之前的某个时刻(只有一次,它不需要每次构建都运行,但是我已经链接到一些脚本来帮助解决这个问题的第二篇文章。)

这里有两个选项:你告诉sn.exe创建一个只包含公钥的密钥和带有该密钥的延迟标志(选中项目属性中“签名”选项卡底部的方框),然后使用sn.exe -Rc "your-container-name" "key.snk"进行后期构建,签名,或者您可以使用AssemblyKeyNameAttribute文件中的简单方法AssemblyInfo.cs,如下所示:

[assembly: AssemblyKeyNameAttribute("Your Key Container Name")]

编译器将为您处理其他所有事情。请记住,您需要确保在尝试构建之前使用sn.exe -c 设置CSP,否则您将在构建时遇到未找到键集错误(以及密钥容器的名称)。