Как отправить CSR в Windows CA для подписи из C #? - PullRequest
0 голосов
/ 06 февраля 2019

Мой сценарий:

У меня есть экземпляр 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)это) для подписи (я застрял здесь в данный момент).
...