C# MimeKit:';RSACng&x27;当前不支持
我正在尝试在.NET核心应用程序中使用C# MimeKit:';RSACng&x27;当前不支持,c#,azure,azure-keyvault,x509certificate2,mimekit,C#,Azure,Azure Keyvault,X509certificate2,Mimekit,我正在尝试在.NET核心应用程序中使用MimeKit创建S/MIME电子邮件。使用本地证书,它可以正常工作,如下所示: var signer = new CmsSigner("cert.pfx", "password"); message.Body = MultipartSigned.Create(ctx, signer, message.Body); 为了使应用程序更安全,我已将证书上载到Azure KeyVault。我的问题已经开始了 其想法是只使用Azure KeyVault的证书,而不
MimeKit
创建S/MIME
电子邮件。使用本地证书,它可以正常工作,如下所示:
var signer = new CmsSigner("cert.pfx", "password");
message.Body = MultipartSigned.Create(ctx, signer, message.Body);
为了使应用程序更安全,我已将证书上载到Azure KeyVault。我的问题已经开始了
其想法是只使用Azure KeyVault的证书,而不使用任何密码等(因此只存储对KeyVault的引用,而不是存储两个链接(KeyVault cert+KeyVault certPass))
以下是我如何尝试从Azure KeyVault获取证书
private static async Task<X509Certificate2> GetCertificate()
{
var tokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(tokenProvider.KeyVaultTokenCallback));
var azureKeyVaultCert = await keyVaultClient.GetSecretAsync("https://<myapp>.vault.azure.net/secrets/<secretName>/<secretId>");
var certBytes = Convert.FromBase64String(azureKeyVaultCert.Value);
var cert = new X509Certificate2(certBytes);
return cert;
}
这里我得到了如下错误:MimeKit:“RSACng”当前不受支持。
之后,我尝试了另一种方法。它工作正常,但是,我需要使用我的密码。我认为这不是一个好主意(尽管我也可以使用Azure KeyVault作为证书密码)
private静态异步任务GetCertificateBytes()
{
var tokenProvider=新AzureServiceTokenProvider();
var keyVaultClient=newkeyvaultclient(newkeyvaultclient.AuthenticationCallback(tokenProvider.KeyVaultTokenCallback));
var azureKeyVaultCert=等待keyVaultClient.GetSecretAsync(“https://.vault.azure.net/secrets//");
var certBytes=Convert.FromBase64String(azureKeyVaultCert.Value);
var certCollection=new X509Certificate2Collection();
导入(certBytes,null,x509keystrageflags.Exportable);
返回certCollection.Export(X509ContentType.Pkcs12,“密码”);
}
var certBytes=等待GetCertificateBytes();
使用(var certStream=new System.IO.MemoryStream(certBytes))
{
var signer=新的CmsSigner(certStream,“密码”);
}
如果我使用wait keyVaultClient.GetCertificateAsync()
,我会得到一个错误,即没有私钥
另外,通过new X509Certificate2()
创建的证书与X509Certificate2Collection.Export()创建的证书之间存在差异
也许我错过了什么?MimeKit中的此提交可能会解决您的问题:-您能从中获取v2.4.1.8并对其进行测试吗?@jstedfast-我将稍后再试。有了这个软件包,我甚至无法启动解决方案。=)是否有此问题的更新?@jstedfast我尝试了netcoreapp3.1的Nuget,但仍然获得了RSACng不受支持的异常。我对git提交的理解是否正确,因为更改的重点是“NET46 | | | NET47 | NET48 | | MOBILE”,而不是dotnet core?netcoreapp3.1没有构建,只有net4x和netstandard2.0。您需要使用net46+目标来测试修复程序。MimeKit中的此提交可能会解决您的问题:-您可以从中获取v2.4.1.8并进行测试吗?@jstedfast-我稍后再试。有了这个软件包,我甚至无法启动解决方案。=)是否有此问题的更新?@jstedfast我尝试了netcoreapp3.1的Nuget,但仍然获得了RSACng不受支持的异常。我对git提交的理解是否正确,因为更改的重点是“NET46 | | | NET47 | NET48 | | MOBILE”,而不是dotnet core?netcoreapp3.1没有构建,只有net4x和netstandard2.0。您需要使用net46+目标测试修复程序。
var cert = new GetCertificate();
var signer = new CmsSigner(cert);
private static async Task<byte[]> GetCertificateBytes()
{
var tokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(tokenProvider.KeyVaultTokenCallback));
var azureKeyVaultCert = await keyVaultClient.GetSecretAsync("https://<myapp>.vault.azure.net/secrets/<secretName>/<secretId>");
var certBytes = Convert.FromBase64String(azureKeyVaultCert.Value);
var certCollection = new X509Certificate2Collection();
certCollection.Import(certBytes, null, X509KeyStorageFlags.Exportable);
return certCollection.Export(X509ContentType.Pkcs12, "password");
}
var certBytes = await GetCertificateBytes();
using(var certStream = new System.IO.MemoryStream(certBytes))
{
var signer = new CmsSigner(certStream, "password");
}