Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MimeKit:';RSACng&x27;当前不支持_C#_Azure_Azure Keyvault_X509certificate2_Mimekit - Fatal编程技术网

C# MimeKit:';RSACng&x27;当前不支持

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的证书,而不

我正在尝试在.NET核心应用程序中使用
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");
}