asp.net-core - 生成 CrypoAPI (CAPI) 私钥
问题描述
我正在尝试使用IXmlEncryptor实现静态加密。特别是使用 CertificateEncryptor。(这是 IXmlRepository 系统的一部分,用于在 ASP.NET Core中共享用于解密 cookie 和一般密钥管理的密钥。)
此文档页面讨论了为此目的使用 X.509 证书。
它表示“仅支持带有CAPI 私钥的证书”。
谷歌搜索显示 CAPI 表示 Microsoft CryptAPI。但我找不到更多关于它的信息,而且我能找到的似乎与 C++ 相关。
当我问他什么是“CAPI 私钥”时,我的“证书人”基本上是这样告诉我的:
Microsoft 生成的转换为 x509 的 PFX 文件有密码。那将是我唯一能想到的。
那是一样的吗?
如果不是,如何创建带有 CAPI 私钥的 X.509 证书?
注意:X.509 证书是文档页面上列出的唯一选项,可在 Linux 机器(容器)上运行。这就是为什么我没有考虑任何其他(可能更容易)的选择。
解决方案
您的“证书人”不正确。
Microsoft 有两个版本的密码学 susbsytems:Legacy CrypotAPI(简称 CryptoAPI 或 CAPI)和 Cryptography Next Generation(CNG,CAPI2)。
CrytpoAPI 是在 Windows 2000 中发明的。旧版 CryptoAPI 在道德上已经过时,不支持 ECC、SHA2:只有 RSA/旧版 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
后缀/前缀,以明确表示它是 CNG API。在 CNG 中,密钥存储在重新设计的称为密钥存储提供程序 (KSP) 的 CSP 中,以将其与传统 CSP 区分开来,因为它们不一样(尽管有一个单向桥可以从 KSP 访问 CSP,但不是其他方式)。
然而,.NET 在采用 CNG 方面遇到了困难,并使其或多或少只能在 .NET 4.7 中使用(以前存在实现,但有已知的限制),并且第 3 方应用程序仅在明确添加对 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
在 Windows 上创建证书(密钥对)时,您可以指定其中任何一个。例如,当使用New-SelfSignedCertificate
PowerShell cmdlet(默认为 CNG KSP)或 certreq.exe 工具生成由外部 CA 签名的请求时。这部分取决于您用于创建证书/证书请求的工具。
推荐阅读
- python - TypeError:只有大小为 1 的数组可以转换为 Python 标量不断到达
- tensorflow - Is it possible to override the progress bar of TensorFlow's keras?
- flutter - 如何在按钮单击时显示动画然后消失在颤动中的表情符号
- python - 如何使用 SQL Server 代理或任何东西自动执行日常任务?
- javascript - 在 Asp.net C# Web 应用程序中集成 Bing 地图
- python - 如何只显示与熊猫中另一个数据框共有的行?
- java - 春天框架。根据请求参数在运行时注入bean
- css - calc中的CSS整数除法
- javascript - 使用javascript对数组进行排序而不改变空或空的地方
- .htaccess - 如何实现 https 重定向到子目录?