生成 CrypoAPI (CAPI) 私钥

Generate a CrypoAPI (CAPI) Private Key

我正在尝试使用 ASP.NET Core 中的 IXmlEncryptor. Specifically using a CertificateEncryptor. (This is part of the IXmlRepository system for sharing keys for decrypting cookies and general key management 实现静态加密。)

docs page 讨论了为此目的使用 X.509 证书。

表示"only certificates with CAPI private keys are supported".

谷歌搜索显示 CAPI 表示 Microsoft CryptAPI。但是我找不到更多关于它的信息,而且我能找到的似乎与 C++ 相关。

当我问 "certificates guy" 什么是 "CAPI private key" 时,我的 "certificates guy" 基本上告诉了我这个:

Microsoft generated PFX files converted to x509 have a password. That would be the only thing I could think of.

是一样的吗?

如果没有,如何创建带有 CAPI 私钥的 X.509 证书?

注意:X.509 证书是 docs page 中所列证书中唯一可在 Linux 机器(容器)上运行的选项。这就是为什么我不考虑任何其他(可能更简单)选项的原因。

您的 "certificate guy" 不正确。

Microsoft 有两个版本的密码学子系统:Legacy CrypotAPI(简称 CryptoAPI 或 CAPI)和下一代密码学(CNG、CAPI2)。

CrytpoAPI 于 Windows 2000 年发明。旧版 CryptoAPI 在道德上已经过时,不支持 ECC、SHA2:仅 RSA/legacy DSA(最多 1k 长密钥),DES/3DES, RCx,无内置 AES。密钥存储在旧版加密服务提供程序(或 CSP)中。不过,在 Windows Vista+ 中,添加了一个带有 SHA2 和 AES 的遗留 CSP,以帮助旧应用程序在不对代码进行太多更改的情况下使用它们。

CNG 于 2007 年在 Windows Vista/Windows Server 2008 中首次引入,它确实是一个好东西:它具有很好的可扩展性,原生支持 NSA Suite B 加密(ECC 非对称密钥, SHA2 算法组)、密钥隔离、统一的 BCrypt 函数集等等。大多数仅限 CNG 的 API 在其名称中包含 NCryptBCryptCNGNG suffixes/prefixes,以明确表明它是 CNG API。在 CNG 中,密钥存储在重新设计的 CSP 中,称为密钥存储提供程序 (KSP),以将其与传统 CSP 区分开来,因为它们不相同(尽管有一个单向桥可以从 KSP 访问 CSP,但在其他方面则不然)。

但是,.NET 在采用 CNG 方面遇到了困难,并使其或多或少只能在 .NET 4.7 中使用(以前存在实现,但有已知的限制),并且第 3 方应用程序仅在明确添加支持时才支持 CNG为此,因为 CNG 使用不同的 API,并且 .NET Framework 升级不会使应用程序支持 CNG。

这是关于 CAPI 和 CAPI2 之间区别的一些理论。

并且您的文档说它需要使用旧版 CSP 的证书来存储私钥。在 Windows 中创建时,如果使用以下提供程序之一,则会使用旧版 CSP:

Microsoft Base Cryptographic Provider v1.0
Microsoft Base DSS and Diffie-Hellman Cryptographic Provider
Microsoft Base DSS Cryptographic Provider
Microsoft Base Smart Card Crypto Provider
Microsoft DH SChannel Cryptographic Provider
Microsoft Enhanced Cryptographic Provider v1.0
Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider
Microsoft Enhanced RSA and AES Cryptographic Provider
Microsoft RSA SChannel Cryptographic Provider <- this is preferred for legacy CSPs
Microsoft Strong Cryptographic Provider

您可以在 Windows 上创建证书(密钥对)时指定其中任何一个。例如,当使用 New-SelfSignedCertificate PowerShell cmdlet(默认为 CNG KSP)或 certreq.exe 工具生成由外部 CA 签名的请求时。这部分取决于您用来创建 certificates/certificate 请求的工具。

这是一个使用 Microsoft RSA SChannel Cryptographic Provider 生成证书的工作示例,如 Crypt32 的回答中所建议的那样。密钥存储在数据库中。在 Windows 10 和 Ubuntu 18.04.5 LTS 上测试。

使用 ASP.NET 核心 3.1。在 Windows 10 上开发并在 Ubuntu 18.04.5.

上托管

以管理员身份使用 PowerShell

New-SelfSignedCertificate -provider "Microsoft RSA SChannel Cryptographic Provider" -FriendlyName "site_key" -KeyAlgorithm RSA -KeyLength 2048 -NotAfter (Get-Date).AddYears(30) -subject "site_key" -KeyExportPolicy "Exportable"

   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\MY

Thumbprint                                Subject
----------                                -------
{thumbprint}                              CN=site_key

$mypwd = ConvertTo-SecureString -String "<secret>" -Force -AsPlainText Get-ChildItem -Path cert:\localMachine\my\{thumbprint} | Export-PfxCertificate -FilePath C:\site.pfx -Password $mypwd

StartUp.ConfigureServices()之后services.AddDbContext()

// using System.IO;
var pfxFile = Path.GetFullPath(Path.Combine("folder1", "site.pfx"));

// using System.Security.Cryptography.X509Certificates;
services.AddDataProtection()
        .PersistKeysToDbContext<MyKeysContext>();
        .ProtectKeysWithCertificate(new X509Certificate2(pfxFile, "<secret>"));

可能需要删除 DataProtectionKeys table 的内容并重新启动网络应用程序以将加密密钥存储在 table。

Microsoft doc about protecting key with certificate

Microsoft doc about protecting key with X509Certificate2 certificate

New-SelfSignedCertificate reference

Export-PfxCertificate reference