X509Certificate2 构造函数抛出磁盘空间不足

Sve*_*sen 4 c# security azure x509certificate

突然之间,无需部署或进行任何其他环境更改,我们就得到了

磁盘空间不足。在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.X509 Certificate2..ctor(系统,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089)在[我们的代码]

有了这一行:

var certificateByes = Convert.FromBase64String(clientCertificateBody);
factory.Credentials.ClientCertificate.Certificate = new X509Certificate2(certificateByes);
Run Code Online (Sandbox Code Playgroud)

我正在努力了解在 Azure Web 应用程序的上下文中这会如何突然发生变化。我们上次部署是在 11 月 20 日,昨天开始抛出。这个基本功能已经使用了几个月,没有出现任何问题。

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

我在这里这里读到了不同类型的错误,但我们的错误消息是不同的,而且这几个月来一直运行良好。

这是否与应用程序运行的时间或填充某些临时存储位置的其他缓存问题有关?

Sve*_*sen 6

经过数小时的研究/调试后,我了解到以下内容:

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

一旦我们解决了这两个问题,并在创建证书时遵循此处的提示#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);
}
Run Code Online (Sandbox Code Playgroud)

  • 有趣的发现 - 默认文件夹似乎是未定期清理的用户文件夹 - 该错误不是文件大小问题,而是目录的文件计数问题太高。检查您的路径 `%APPDATA%\Microsoft\Crypto\RSA\<sid>\` (2认同)