【问题标题】:X509Certificate2 Constructor Throwing There is not enough space on the diskX509Certificate2 Constructor Throwing 磁盘空间不足
【发布时间】:2019-05-06 03:33:32
【问题描述】:

突然之间,在没有部署或进行任何其他环境更改的情况下,我们得到了

磁盘空间不足。 在 System.Security.Cryptography.CryptographicException.ThrowCryptographicException (mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089) 在 System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob (mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089) 在 System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob (mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089) 在 System.Security.Cryptography.X509Certificates.X509Certificate2..ctor (系统,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089) 在 [我们的代码]

用这一行:

var certificateByes = Convert.FromBase64String(clientCertificateBody);
factory.Credentials.ClientCertificate.Certificate = new X509Certificate2(certificateByes);

我很难看到这会如何突然在 Azure Web 应用程序的上下文中中断。我们最后一次部署是在 11 月 20 日,昨天开始投掷。这个基本功能已经使用了几个月,没有出现任何问题。

我们之前肯定在这方面遇到过麻烦,我们正在读取的字符串是从密钥库中检索到的,但同样,这里没有任何改变。

我已经了解了不同类型的错误 herehere,但我们的错误信息是不同的,而且这几个月来一直运行良好。

这可能与应用程序运行了多长时间或其他一些缓存问题填满了某个临时存储位置有关吗?

【问题讨论】:

  • 您可能已经填满了包含 %USERPROFILE% 的硬盘。除非您的应用程序在有机会完成之前异常终止,否则证书本身不会导致问题。

标签: c# azure security x509certificate


【解决方案1】:

这是我经过数小时的研究/调试后所知道的:

  • 我们遇到了一个逻辑错误,每次加载而不是缓存它时,我们都会创建一个新的 X509Certificate2 对象
  • 我们不得不以比我们需要的方式更频繁地创建这些证书

一旦我们解决了这两个问题,并在创建证书时遵循here 中的提示 #5,我们就不会再看到这些错误了。作为参考,提示是不要从字节数组创建这些证书对象,因为临时文件是在幕后为您创建的,它们可能无法清理。相反,我们正在做作者建议的事情:

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);
}

【讨论】:

  • 有趣的发现 - 默认文件夹似乎是没有定期清理的用户文件夹 - 错误不是文件大小问题,而是目录的文件计数问题太高。检查您的路径 `%APPDATA%\Microsoft\Crypto\RSA\`
【解决方案2】:

我遇到了同样的问题,一个在应用服务上启用了 MSI 的服务计划。 通过代码清除包含所有目录和文件的临时路径不起作用。我猜私钥文件夹中有 65535 个文件,我检查了 Octopus deploy blog article 并试图从代码中删除这么多位置,因为在 Kudo 或控制台中你看不到它,但错误一直被抛出。重新部署到另一个应用服务计划不是一种选择。

所以这个关于 stackoverflow 的另一个问题有一个更干净的解决方案的答案:

X509Certificate2 constructor throwing Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: There is not enough space on the disk

解决方案:使用 EmphemeralKeySet StorageFlag。

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2013-10-09
    • 2015-12-04
    • 2015-12-30
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多