生成 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 在其名称中包含 NCrypt
、BCrypt
、CNG
、NG
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
我正在尝试使用 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 在其名称中包含 NCrypt
、BCrypt
、CNG
、NG
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