X509Certificate2构造函数抛出“磁盘上没有足够的空间”的错误。

4
突然之间,没有部署或做任何其他环境更改,我们遇到了以下问题:

磁盘空间不足。 at System.Security.Cryptography.CryptographicException.ThrowCryptographicException (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089) at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089) at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089) at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor (System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089) at [我们的代码]

此行引起上述问题:
var certificateByes = Convert.FromBase64String(clientCertificateBody);
factory.Credentials.ClientCertificate.Certificate = new X509Certificate2(certificateByes);

我很难理解在Azure web应用程序的情况下为什么突然会出现这种问题。我们上一次部署是在11月20日,而这个问题是昨天开始出现的。这个基本功能已经存在了几个月而没有任何问题。

我们确实曾经在这个领域遇到过麻烦,而我们从密钥保管库中检索字符串,但是同样,这里没有任何更改。

我读到了关于不同类型错误的内容herehere,但我们的错误消息不同,并且这几个月都可以正常工作。

这可能与应用程序运行时间或其他缓存问题有关,导致临时存储位置填满吗?


你很可能已经填满了包含%USERPROFILE%的硬盘。除非您的应用程序在完成之前异常终止,否则证书本身不会引起问题。 - bartonjs
2个回答

6
经过多个小时的研究和调试,我了解到以下信息:
  • 我们存在逻辑错误,每次加载时都会创建一个新的X509Certificate2对象而不是缓存它
  • 我们陷入了不得不频繁创建这些证书的境地,实际上并不需要这样做
解决以上两个问题后,遵循此处的第五个提示,在创建证书时,我们就不再看到这些错误了。该提示建议不要从字节数组创建这些证书对象,因为会在幕后为您创建临时文件,而这些文件有可能无法被清除。取而代之的是,我们正在执行作者建议的某些操作:
var bytes = new byte[]{}; //byte array representing cert body
var file = Path.Combine(Path.GetTempPath(), "Cert" + Guid.NewGuid());
try
{
    File.WriteAllBytes(file, bytes);
    return new X509Certificate2(file, /* ...options... */);
}
finally
{
    File.Delete(file);
}

2
有趣的发现 - 默认文件夹似乎是用户文件夹,该文件夹不会定期清理 - 错误不是文件大小问题,而是目录中文件数量过多的问题。请检查您的路径 %APPDATA%\Microsoft\Crypto\RSA\<sid>\ - SliverNinja - MSFT

2
我遇到了相同的问题,App Service上启用了MSI的一个服务计划。 通过代码清除包括所有目录和文件在内的临时路径并没有起作用。我猜私钥文件夹中有65535个文件,在Octopus deploy博客文章中我检查过,试图从代码中删除如此多的位置,因为在Kudo或Console中看不到它,但错误仍然被抛出。重新部署到另一个App Service Plan不是一个选项。
因此,stackoverflow上的另一个问题有一个更干净的解决方案的答案: X509Certificate2构造函数抛出Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: 磁盘空间不足 解决方案:使用EmphemeralKeySet StorageFlag。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接