Возможно ли в приложении .net core получить сертификат из aws certificate manager и использовать его в сообщении httpclient?

Мое основное приложение .Net отправляет почтовый запрос внешней веб-службе с помощью HttpClient. Внешняя веб-служба требует сертификата для проверки.

Сертификаты установлены в AWS, и у меня есть ARN, указывающий на сертификат.

Можно ли получить сертификат программно из AWS Certificate Manager и использовать его в моем HtppClient, например, это код, который я обычно использовал бы для добавления сертификата, но мне нужно получить его из AWS.

   private HttpClientHandler HttpClientHandler()
   {
        var handler = new HttpClientHandler
        {
            ClientCertificateOptions = ClientCertificateOption.Manual,
            SslProtocols = SslProtocols.Tls12
        };
        handler.ClientCertificates.Add(new X509Certificate2("cert.crt")); //TODO: fetch from AWS.
        return handler;
    }
4
0
1 743
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы используете AWS SDK, вы можете получить сертификаты с помощью AmazonCertificateManagerClient. Подробнее см. документация по AWS SDK. (выберите Amazon.CertificateManager> AmazonCertificateManagerClient)

Ответ принят как подходящий

Значит, это возможно.

Я установил AWSSDK.Core и AWSSDK.CertificateManager из NuGet.

Затем я создал файл учетных данных для AWS, см. Инструкции от Amazon. https://docs.aws.amazon.com/cli/latest/userguide/cli-config-files.html

Затем я использовал AmazonCertificateManagerClient для получения сертификата.

AmazonCertificateManagerClient client = new AmazonCertificateManagerClient();
var certificates = client.GetCertificateAsync(arn).Result;

Затем я преобразовал сертификат из строки в байты, а затем добавил в обработчик.

var handler = new HttpClientHandler{
  ClientCertificateOptions = ClientCertificateOption.Manual,
  SslProtocols = SslProtocols.Tls12
};

byte[] toBytes = Encoding.ASCII.GetBytes(certificates.Certificate);
var cert = new X509Certificate2(toBytes);

handler.ClientCertificates.Add(cert); 
var httpClient = new HttpClient(handler);

Очевидно, что код не подходит для производства, надеюсь, это поможет.

У меня это не работает. Я заметил, что сертификат, исходящий от ACM, не включает закрытый ключ.

Zack Marrapese 15.05.2019 19:53

Как упоминал Зак, принятый ответ не работает. Он действительно извлекает сертификат из ACM, но его нельзя использовать в качестве сертификата клиента для HttpClient, поскольку он не имеет закрытого ключа.

Насколько я могу судить, нет способа получить закрытый ключ из ACM, поэтому я поместил его в SecretsManager и сделал что-то вроде:

var certManagerClient = new AmazonCertificateManagerClient();
var awsCert = certManagerClient.GetCertificateAsync(arn).Result;
byte[] awsBytes = Encoding.ASCII.GetBytes(awsCert.Certificate);
var cert = new X509Certificate2(awsBytes);

var secretsManagerClient = new AmazonSecretsManagerClient();
var privateKey = secretsManagerClient.GetSecretValueAsync(new GetSecretValueRequest { SecretId = secretId }).Result.SecretString;
byte[] privateKeyBytes = Convert.FromBase64String(privateKey);
var privateKey = RSA.Create();
privateKey.ImportRSAPrivateKey(new ReadOnlySpan<byte>(privateKeyBytes), out _);
var certWithPrivateKey = cert.CopyWithPrivateKey(privateKey);

А затем с помощью certWithPrivateKey в моем HttpClientHandler:

var handler = new HttpClientHandler { ClientCertificateOptions = ClientCertificateOption.Manual };
handler.ClientCertificates.Add(certWithPrivateKey);

Я пытаюсь повторить то, что вы здесь сделали. Я продолжаю получать поврежденные данные ASN1 при попытке прочитать ключ. Как вы настроили / импортировали ключ в менеджер секретов?

JDBennett 03.08.2021 12:58

Я просто скопировал строку base-64 из моего файла pem в диспетчер секретов в том же формате, который требуется AWS ACM.

Nic Wolfe 04.08.2021 17:49

Другие вопросы по теме