Мой сценарий:
У меня есть экземпляр EC2, работающий Операционная система Windows Server 2016 DataCenter .Этот экземпляр EC2 настроен для работы в качестве CA и IIS серверов (я тестирую cloudhsm , поэтому я могу использовать несколько служб на одном сервере),Мой CA настроен на RSA # Cavium Key Storage Provider (так как он поддерживает AWS CloudHSM Key Storage Provider).Теперь из моего примера приложения .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) и подписать его.После подписания я хочу отправить подписанный сертификат обратно пользователю.В настоящее время я разместил мое примерное приложение webapi в том же экземпляре EC2.Это приложение на самом деле предоставляет конечную точку, которую я могу нажать через почтальона и передать некоторые данные в виде тела запроса (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 (после комментария Михала)
Ниже приведена некоторая информация для вашего интереса:
Текущий сценарий:
- мы используем сторонний API для подписи некоторых важных данных.
- Таким образом, мы делаем POST-запрос к этой конкретной конечной точке с данными, которые мы хотим подписать.
- Сторонний API обрабатывает все для нас за сценой.Мы знаем, что они используют какой-то сервис HSM для подписи данных.
Мое намерение:
- Я пытаюсь добиться того жефункциональность с использованием AWS CloudHSM.
- Процесс вызова должен быть таким же, то есть мы все равно должны вызывать конечную точку с данными и получать подписанную копию данных.
- Для этого мое понимание заключалось в созданииCSR на стороне сервера и подписать его с помощью CloudHSM изнутри сервера.
- Для этого я создал образец приложения .Net API, которое предоставляет конечную точку, где я могу публиковать свои данные для подписи.
- Тогда мое приложение отвечает за создание CSR ( Я уже сделал ), а затем отправляю CSR в CA (это мой экземпляр EC2 Windows Server 2016, на котором включена функция CA)это) для подписи (я застрял здесь в данный момент).