我发现自己处于需要颁发客户端证书以进行身份验证的情况。为此,我需要一个根证书或中间证书来签署客户端证书。这自然会导致需要安全存储签名证书。我有一个 Azure 订阅,它提供了一个 Key Vault,可以存储和创建证书。我对创建部分感到高兴,因为这意味着我的机器上不会有任何签名证书,甚至不会在内存中短暂存在。或者我是这么想的...
事实证明,Key Vault 不提供对证书对象的任何加密操作(例如 Key Vault - Key 提供)。这意味着我必须从保管库下载整个证书,让私钥离开“安全位置”。此时我正在质疑“安全”部分,因为根据我的理解,不应该导出私钥,但确实如此。
我需要一个 .Net 解决方案,所以我查看了 Azure SDK for .Net和 Azure Key Vault REST API但他们没有提供我需要的东西。
我看错地方了,还是 Azure Key Vault 不适合这样使用?
我最初想到的简化(我将省略对所有服务的身份验证)工作流程如下:
- 在保管库中创建根(或根和中间)
- 创建 key 对(例如
RSA.Create()
) - 创建证书请求(例如
System.Security.Cryptography.X509Certificates.CertificateRequest
) - 通过 Azure SDK(或同等工具)将请求发送到 Vault,让 Root(或 Intermediate)签署请求
- 获取已签名的请求并使用它来创建已签名的客户端证书。
但是好像不太可能。
最佳答案
所以我找到的解决方案如下:
- 创建私钥(例如 openssl)
- 使用此 key 创建 pfx/p12 证书
- 将公共(public)证书部分上传为 Azure KeyVault Secret
- 将 key 上传为 Azure KeyVault Key 对象
- 为 RSA 或 ECDSA 创建自定义 X509SignatureGenerator,并使用 Azure SDK 和 KeyVault Key 对象进行签名(创建签名后请注意正确的 ASN.1 格式)。 .Net 6 代码是开源的,因此您可以查找标准 X509SignatureGenerator 的功能。
- 在 .Net 中创建证书请求并使用自定义 X509SignatureGenerator
- 按原样存储新创建的证书,或将其存储为带有公共(public)证书部分的 X509Certificate2Collection(之前上传到 Key Vault),以获得完整的信任链。
关于.net - 带有 Azure Key Vault 的 PKI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76182532/