c# - 如何向 Windows CA 提交 CSR 以从 C# 进行签名?
问题描述
我的场景:
我有一个运行Windows Server 2016 DataCenter OS的 EC2 实例。此 EC2 实例配置为用作CA和IIS服务器(我正在测试cloudhsm,因此我可以在同一服务器中拥有多个服务)。我的 CA 配置了RSA#Cavium 密钥存储提供程序(因为它支持 AWS CloudHSM 密钥存储提供程序)。现在,从我的示例 .Net WebAPI 应用程序中,我可以使用以下代码创建 CSR:
private async Task<CertificateSigningResponse> ActualSigningAsync(CertificateSigningRequest csr)
{
CertificateSigningResponse certificateSigningResponse;
try
{
using (RSA rsa = RSA.Create(csr.KeySize))
{
CertificateRequest request = new CertificateRequest("CN=servername-CA2", rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
OidCollection oidCollection = new OidCollection();
oidCollection.Add(new Oid("1.3.6.1.5.5.7.3.8"));
request.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, true));
request.CertificateExtensions.Add(new X509EnhancedKeyUsageExtension(oidCollection, true));
request.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(request.PublicKey, false));
var serialNumberInBytes = System.Text.Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
/*
// below line creates a self signed certificate
var selfSignedCertificate = request.Create(
new X500DistinguishedName("CN=servername-CA2"),
X509SignatureGenerator.CreateForRSA(rsa, RSASignaturePadding.Pkcs1),
DateTimeOffset.Now,
DateTimeOffset.Now.AddMonths(1),
serialNumberInBytes);
*/
var certSigningRequest = request.CreateSigningRequest(X509SignatureGenerator.CreateForRSA(rsa, RSASignaturePadding.Pkcs1));
if (certSigningRequest != null)
{
certificateSigningResponse = PopulateCertificateSigningResponse(JsonConvert.SerializeObject(certSigningRequest), $"Sample Cert with Sl#: {certSigningRequest}");
}
else
{
certificateSigningResponse = PopulateCertificateSigningResponse("", $"Error: {request.PublicKey}");
}
}
}
catch (Exception ex)
{
certificateSigningResponse = PopulateCertificateSigningResponse(string.Empty, ex.Message);
}
return certificateSigningResponse;
}
现在,我想将此 CSR 发送到我的 CA(在 EC2 上运行)并对其进行签名。签名后,我想将签名的证书发回给用户。目前,我已经在同一个 EC2 实例上托管了我的示例 webapi 应用程序。这个应用程序实际上公开了一个端点,我可以通过邮递员点击它并将一些数据作为请求正文 (POST) 传递。
因此,理想情况下,应用程序接收我的 POST 请求并从中提取数据,然后使用该数据创建一个 csr。现在我想将此 csr 发送给我的 CA,对其进行签名,最后将签名证书返回给用户。下面的伪代码可能会让您对我的要求有所了解:
//pseudo code; not existed
// request is generated in above code
var caService = new CAService();//can use my ca info i.e. name, public dns, ip
var response = await caService.SignAsync(request);//response should be a cert
return response;
我见过很少使用CertUtilLib/CertEnrollLib的帖子,但我想通过完全托管的代码来实现这一点。另外,如果不可能,请建议我一些替代方案。谢谢。
编辑 1(在 Michal 评论之后)
以下是一些您感兴趣的信息:
当前场景:
- 我们正在使用第 3 方 API 来签署一些关键数据。
- 通过这种方式,我们使用我们想要签名的数据向该特定端点发出 POST 请求。
- 第 3 方 API 在幕后为我们处理一切。我们知道他们在终端使用一些 HSM 服务来签署数据。
我的意图:
- 我正在尝试使用 AWS CloudHSM 实现相同的功能。
- 调用过程应该相同,即我们仍然应该使用数据调用端点并获取数据的签名副本。
- 为此,我的理解是在服务器端创建 CSR 并在服务器内使用 CloudHSM 对其进行签名。
- 为此,我创建了一个示例 .Net API 应用程序,该应用程序公开了一个端点,我可以在其中发布要签名的数据。
- 然后我的应用程序负责创建 CSR(我已经这样做了),然后将 CSR 发送到 CA(这是我的 EC2 Windows Server 2016 实例,它启用了 CA 功能)进行签名(我被困在这里眼下)。
解决方案
推荐阅读
- spring-boot - RabbitMQ/Spring AMQP - 将消息留在队列中
- javascript - 根据PDF表单中的独立表单域计算日期
- amazon-neptune - AWS Neptune /system Bad Route 连接错误
- javascript - 是否有一个 webpack 加载器/NPM 脚本只编译我的 SCSS 文件,类似于 Gulp 的工作方式?
- javascript - 如何通过反应使用一个useMemo?
- content-type - Strapi 隐藏内容类型
- db2 - 默认字段定义之间的差异
- apache-kafka - Kafka 1.0.x 删除消费者组
- javascript - 如何在可见性上播放视频
- r - 为什么我的闪亮应用程序中的“过滤器”会因输入长度错误而崩溃?