Asp.net core 生成CrypoAPI(CAPI)私钥

Asp.net core 生成CrypoAPI(CAPI)私钥,asp.net-core,encryption,certificate,x509certificate,cryptoapi,Asp.net Core,Encryption,Certificate,X509certificate,Cryptoapi,我正在尝试使用一个。特别是使用证书加密程序。(这是IXmlRepository系统的一部分,用于在ASP.NET Core中共享用于解密Cookie和general的密钥。) 本文讨论了为此目的使用X.509证书 它表示“仅支持具有CAPI私钥的证书” 谷歌搜索表明CAPI是指微软的CryptoAPI。但是我找不到更多关于它的东西,我能找到的似乎是C++相关的。 当我问我的“证书人”什么是“CAPI私钥”时,他基本上告诉了我: Microsoft生成的转换为x509的PFX文件具有密码。那将是我

我正在尝试使用一个。特别是使用证书加密程序。(这是IXmlRepository系统的一部分,用于在ASP.NET Core中共享用于解密Cookie和general的密钥。)

本文讨论了为此目的使用X.509证书

它表示“仅支持具有CAPI私钥的证书”

谷歌搜索表明CAPI是指微软的CryptoAPI。但是我找不到更多关于它的东西,我能找到的似乎是C++相关的。 当我问我的“证书人”什么是“CAPI私钥”时,他基本上告诉了我:

Microsoft生成的转换为x509的PFX文件具有密码。那将是我唯一能想到的

这是同一件事吗

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

注意:X.509证书是上列出的将在Linux机器(容器)上工作的证书中的唯一选项。这就是为什么我没有考虑任何其他(可能更简单的)选项。

你的“证书人”是不正确的

微软有两个版本的加密系统:传统的CryptoAPI(简称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套件B加密(ECC非对称密钥、SHA2算法组)、密钥隔离、统一的BCrypt函数集,而且必须更多。大多数纯CNG API包括
NCrypt
BCrypt
CNG
NG
后缀/前缀,以明确表示这是CNG API。在CNG中,密钥存储在重新设计的CSP(称为密钥存储提供程序(KSP))中,以区别于传统CSP,因为它们不同(尽管存在从KSP访问CSP的单向网桥,但其他方面则不同)

然而,.NET在采用CNG方面遇到了困难,使其或多或少只能在.NET 4.7中使用(以前存在实现,但有已知的限制),第三方应用程序只有在明确添加对CNG的支持时才支持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
Microsoft基本加密提供程序v1.0
Microsoft Base DSS和Diffie Hellman加密提供程序
Microsoft基本DSS加密提供程序
Microsoft Base智能卡加密提供商
Microsoft DH SChannel加密提供程序
Microsoft增强加密提供程序v1.0
Microsoft增强的DSS和Diffie-Hellman加密提供程序
Microsoft增强的RSA和AES加密提供程序

Microsoft RSA SChannel Cryptographic Provider这是一个使用
Microsoft RSA SChannel Cryptographic Provider
生成Crypt32答案中建议的证书的工作示例。密钥存储在数据库中。在Windows10和Ubuntu18.04.5LTS上测试

使用ASP.NET Core 3.1。在Windows10上开发,在Ubuntu 18.04.5上托管

使用PowerShell作为管理员

新的自签名证书-提供程序“Microsoft RSA SChannel加密提供程序”-FriendlyName“site\u key”-KeyAlgorithm RSA-KeyLength 2048-NotAfter(获取日期)。AddYears(30)-主题“site\u key”-KeyExportPolicy“Exportable”

$mypwd=converttosecurestring-String'-Force-AsPlainText
Get ChildItem-Path cert:\localMachine\my\{thumbprint}| Export PfxCertificate-FilePath C:\site.pfx-Password$mypwd

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

//使用System.IO;
var pfxFile=Path.GetFullPath(Path.Combine(“folder1”、“site.pfx”);
//使用System.Security.Cryptography.X509证书;
services.AddDataProtection()
.persistenkeystdbcontext();
.ProtectKeysWithCertificate(新的X509Certificate2(PFX文件“”);
可能需要删除
DataProtectionKeys
表的内容,然后重新启动web应用程序以在表中存储加密密钥


谢谢您的回答!这些都是很好的细节!(更新得多的).Net Core IXmlEncryptor只支持Windows 2000时代的解决方案,我觉得这太疯狂了!我很困惑为什么他们会在将.Net“重写”为.Net Core.Interest时这样做。这些API非常新(仅限(.NET Core)。也许,我不知道人们对旧东西有着深刻的依赖。但这是另一个问题。CAPI/CNG的选择在管理世界和本地世界一样明确。在
System.Security.Cryptography.RSA
的两个实现之间,
rsacyptoserviceprovider
类在传统CryptoAPI之上工作,而
RSAKey
由CNG支持。
   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\MY

Thumbprint                                Subject
----------                                -------
{thumbprint}                              CN=site_key
// 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>"));