本地机器证书 (certlm.msc) - 导入时选择“Microsoft 软件密钥存储提供程序”

本地机器证书 (certlm.msc) - 导入时选择“Microsoft 软件密钥存储提供程序”

通过 CERTLM 导入设备证书/私钥时,GUI 似乎选择了一个名为“Microsoft Strong Cryptographic Provider”的弃用加密服务提供程序 (CSP);我想知道是否有办法通过向导或组策略或(其他方式)将其更改为“Microsoft Software Key Storage Provider”。

更多详细信息:供应商要求我通过以下行命令语法将 PFX 导入 Windows 11 本地机器证书存储:

certutil -csp "Microsoft Software Key Storage Provider" -importpfx MyPathToCertificate.pfx NoExport

这对他们的软件来说效果很好,但是当我之前尝试导入相同的 PFX 时,我使用 CERTLM (GUI) 将证书导入到相同位置(本地机器/个人存储)。当时这似乎有效(证书出现在那里),但导致了解密错误,如供应商的日志所示。

以下是我通过 CERTLM 导入的方法:

  1. 我通过 UAC 启动了命令提示符/选择证书(本地机器)
  2. 我使用默认选项将 PFX 导入到个人存储

运行以下命令后: Certutil -store My

我注意到证书中有以下一行: Provider = Microsoft Strong Cryptographic Provider

而 certutil 命令明确选择了“Microsoft Software Key Storage Provider”

根据https://www.pkisolutions.com/understanding-microsoft-crypto-providers/“Microsoft Strong Cryptographic Provider” 是一个已弃用的旧版提供程序,而“Microsoft Software Key Storage Provider” 是使用新密钥的现代首选。

不同的 CSP 解释了为什么供应商的应用程序在最初导入后无法运行,我理解为什么 MS 会选择“旧”提供商作为默认提供商以实现向后兼容,但我很好奇是否有办法在通过 CERTLM 执行导入时指定 CSP。

答案1

对你的问题的简短回答:不,你无法在 MMC GUI 中导入时指定提供程序,你必须使用 certutil。

证书 MMC(certmgr.msccertlm.msc)尝试将密钥导入到与 PKCS#12 文件中指定为属性的同一提供程序中(Windows 计算机在证书导出到 PFX 期间设置此属性,并且导入逻辑尊重此属性)。如果未指定提供程序或提供程序不可用,则密钥将导入到旧版 CSP 中。原因是 2023 年有许多应用程序不支持 CNG 提供程序,而 CERTLM 使用最兼容的提供程序。

如果您想使用不同的提供程序,则必须使用certutil -importPFX参数-csp

答案2

Crypt32 给出了最好的简短答案,但我会尝试添加一些额外的陷阱:

答案:你不应该需要选择"Microsoft Software Key Storage Provider"原始证书是否由同一提供商创建并通过 CERTLM 导出为 pfx。如果您需要指定您的提供程序,您可以覆盖它(例如使用certutil -importPFXwith-csp参数)。

更多细节:如果你和我一样刚开始使用,你可能已经阅读过微软的文档这里它提供了一种通过 PowerShell 和命令创建自签名证书的方法New-SelfSignedCertificate

我在网上读到的所有内容都表明该New-SelfSignedCertificate命令默认以作为提供商创建证书"Microsoft Software Key Storage Provider"。但是,当您按照 Microsoft 文档中的步骤操作时,您最终会以Microsoft Strong Cryptographic Provider作为提供商。为什么?

问题出在以下这一行:KeySpec = 'Signature'

根据Microsoft 关于 PS 命令本身的文档,KeySpec 本质上是一个遗留属性:

“如果私钥由旧式 CSP 管理,则值为 KeyExchange 或 Signature。如果密钥由下一代加密技术 (CNG) KSP 管理,则值为 None。”

通过包含 KeySpec 的值,我们最终创建了一个使用默认旧式提供程序 ( Microsoft Strong Cryptographic Provider) 的证书。

我们该如何解决这个问题?只需将该属性替换为以下两个:

KeyUsage = 'CertSign'
KeyUsageProperty = 'Sign'

最后的例子看起来像这样:

 $params = @{
     Type = 'Custom'
     Subject = 'CN=Your Subject Here'
     KeyExportPolicy = 'Exportable'
     KeyUsage = 'CertSign'
     KeyUsageProperty = 'Sign'
     KeyLength = 2048
     HashAlgorithm = 'sha256'
     NotAfter = (Get-Date).AddYears(2)
     CertStoreLocation = 'Cert:\CurrentUser\My' 
} 
$cert = New-SelfSignedCertificate @params

如果您在此之后运行此命令:certutil -user -store My 您应该会看到一行内容,内容是Provider = Microsoft Software Key Storage Provider该证书之后的内容。

相关内容