我的.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);
答案 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);