.NET Core应用程序中是否可以从AWS Certificate Manager检索证书并在HttpClient帖子中使用它?

时间:2018-09-10 08:50:58

标签: .net-core aws-sdk x509certificate2 aws-certificate-manager

我的.Net核心应用程序使用HttpClient向外部Web服务发出发布请求。外部Web服务需要证书进行验证。

证书安装在AWS中,并且我有一个指向证书的ARN。

是否可以通过编程方式从AWS Certificate Manager获取证书,并在我的HtppClient中使用它,例如,这是我通常用来添加证书的代码,但我需要从AWS获得证书。

ChromeOptions options = new ChromeOptions();
// disable ephemeral flash permissions flag
options.addArguments("--disable-features=EnableEphemeralFlashPermission");
Map<String, Object> prefs = new HashMap<>();
// Enable flash for all sites for Chrome 69
prefs.put("profile.content_settings.exceptions.plugins.*,*.setting", 1);

options.setExperimentalOption("prefs", prefs);
nestedDriver = new ChromeDriver(options);

3 个答案:

答案 0 :(得分:4)

所以,有可能。

我从NuGet安装了AWSSDK.Core和AWSSDK.CertificateManager。

然后,我为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);

很明显,不是有价值的代码,希望对您有所帮助。

答案 1 :(得分:2)

如果您使用AWS开发工具包,则可以使用AmazonCertificateManagerClient获得证书。有关详情,请参见the AWS SDK documentation。 (选择Amazon.CertificateManager> AmazonCertificateManagerClient

答案 2 :(得分:1)

正如扎克所提到的,接受的答案不起作用。它确实从 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);

然后在我的 HttpClientHandler 中使用 certWithPrivateKey:

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