提问人:maxwellb 提问时间:6/16/2009 最后编辑:Johannes Rudolphmaxwellb 更新时间:9/18/2017 访问量:980
sn.exe 是否可以利用 Windows 证书存储?
Can sn.exe utilize the Windows certificate store?
问:
若要在 .NET 中使用 sn.exe 对程序集进行签名,是否可以指定私钥仅包含在 Windows CryptoAPI 密钥存储中的公钥?
我看到了用于指定 CSP 名称和容器名称的选项。
是否有用于访问 Windows 证书的值?(即可从 Windows EFS、Outlook、Internet Explorer 等访问的那些)
谢谢。
评论:具体来说,我之所以问这个问题,是因为有一些密钥没有将私钥标记为可导出,因此我无法导出 .pfx 并遵循该路线。
答:
本周末,我也有同样的问题。
是的,它可以配置为使用 Windows 证书存储,如果您真正具有安全意识,则绝对应该这样做。它使得意外泄露私钥变得非常困难(如果你使用像Yubikey这样的智能卡,它就不可能泄露私钥 - 操作系统永远不会看到它)。
我在博客上的帖子中以两种不同但相关的方式记录了如何做到这一点。
如果只是在个人证书存储中使用证书,而不使用智能卡,则相对容易。
在 PowerShell 中,需要获取证书的详细信息:In PowerShell, you need to get the details of your certificate:
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")]
编译器将为您处理其他所有事情。请记住,在尝试生成之前,需要确保已使用 CSP 设置,否则在生成时将收到“找不到密钥集”错误(以及密钥容器的名称)。sn.exe -c
评论