X509Certificate2 Constructor Throwing Недостаточно места на диске - PullRequest
0 голосов
/ 04 декабря 2018

Внезапно, без развертывания или внесения каких-либо изменений среды, мы получаем

Недостаточно места на диске.в System.Security.Cryptography.CryptographicException.ThrowCryptographicException (mscorlib, Версия = 4.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089) в System.Security.Cryptography.X509Certificates.X509lo.0 Версии_LB0.нейтральный, PublicKeyToken = b77a5c561934e089) в System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob (mscorlib, Версия = 4.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c56tificate2., Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089) в [НАШ КОД]

С этой строкой:

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

Я изо всех сил пытаюсь увидеть, как этоВнезапно произойдет сбой в контексте веб-приложения Azure.В последний раз мы развернулись 20 ноября, и вчера это началось.Эта базовая функциональность работала месяцами без проблем.

У нас наверняка были проблемы в этой области раньше, и строка, с которой мы читаем, извлекается из хранилища ключей, но, опять же, здесь ничего не изменилось.

Я читал о различных типах ошибок здесь и здесь , но наше сообщение об ошибке другое, и снова, это работало отлично в течение нескольких месяцев.

Может ли это быть связано с тем, как долго работает приложение, или с какой-либо другой проблемой кэширования, которая заполняет какое-то временное хранилище?

1 Ответ

0 голосов
/ 11 декабря 2018

Вот что я знаю после многих часов исследований / отладки:

  • У нас была логическая ошибка, когда мы создавали новый 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...