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

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

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

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

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

谢谢你。

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

最佳答案

我在本周结束时遇到了同样的问题。

,它可以被配置为使用 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)"

您需要确定用于访问该 key 容器的 key 容器名称和 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 创建一个仅包含公钥的 key 并使用该 key 延迟签名(选中项目属性中“签名”选项卡底部的框),然后发布 -构建,使用 sn.exe -Rc "your-container-name" "key.snk" 签名或者您可以使用简单的方法:AssemblyKeyNameAttributeAssemblyInfo.cs文件如下:
[assembly: AssemblyKeyNameAttribute("Your Key Container Name")]

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

关于.net - sn.exe 可以使用 Windows 证书存储吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/997401/

相关文章:

c# - 为什么在 Windows 7 而不是 Windows 8 上检测到 FileSystemWatcher 属性更改?

c# - (400) 错误请求和更新条目时发生错误

javascript 和 VB.net 返回不正确的结果

java - J2ME - 代码签名 - 适用于诺基亚、三星、Micromax、LG 等所有手机的证书是什么?

c# - 使用驱动程序签名证书进行代码签名

c# - 如果等待的任务链上有 'unwrapped'任务,则Task.Result/wait(..)无限期等待,而如果使用 'async/await',则成功完成

.net - 如何调整 Nancy 模型绑定(bind)中的字段名称?

c# - 如何等待文件完全复制?

winforms - 通过事件目录进行 Winform 用户授权

code-signing - 使用Apple证书对Windows程序进行代码签名?