X509Certificate2构造函数抛出磁盘上没有足够的空间

时间:2018-12-04 16:30:38

标签: c# azure security 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.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,但我们的错误消息有所不同,而且反复出现了好几个月。

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

我遇到了同样的问题,一个在App Service上启用了MSI的服务计划。 通过代码清除temppath包括所有目录和文件均无效。我猜私钥文件夹中包含65535个文件,我检查了Octopus deploy blog article并试图从代码中删除这么多位置,因为在Kudo或Console中您看不到它,但是错误始终被抛出。无法重新部署到另一个应用程序服务计划。

所以关于stackoverflow的另一个问题给出了一个更干净的解决方案:

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

解决方案:使用EmphemeralKeySet StorageFlag。

enter image description here