【问题标题】:Can sn.exe utilize the Windows certificate store?sn.exe 可以利用 Windows 证书存储吗?
【发布时间】:2009-06-15 17:44:39
【问题描述】:

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

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

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

谢谢。

评论: 具体来说,我之所以这样问,是因为有一些密钥没有将私钥标记为可导出,因此我无法导出 .pfx 并遵循该路线。

【问题讨论】:

  • 我在 Machine Stores 上找到了 MSDN 文章,但这是关于 ActiveDirectory 权限管理的。我也找不到它谈论的 DRM 目录。但是,有一个目录 Application Data\Microsoft\Crypto\RSA\MachineKeys,以及几个仅以序列号或 GUID 命名的文件。 (256bit-hex)_(32bit)-(16bit)-(16bit)-(16-bit)-(48bit)是文件名的格式。这些是否可用于/可寻址以识别 sn.exe 的公钥?

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


【解决方案1】:

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

是的,它可以配置为使用 Windows 证书存储,如果您真的有安全意识,您应该绝对这样做。这使得意外泄露私钥变得非常困难(如果您使用像 Yubikey 这样的智能卡,就不可能泄露私钥 - 操作系统永远不会看到它)。

我在twodifferent 中记录了如何做到这一点,但在我的博客上的帖子中有相关的礼仪。

如果您只是使用个人证书存储中的证书,而不使用智能卡,则相对容易。

在 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" 签名,或者您可以使用简单的方法:AssemblyKeyNameAttributeAssemblyInfo.cs 文件中,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多