m_safeCertContext - неверный дескриптор - PullRequest
13 голосов
/ 14 января 2009

Я боролся с проблемой, возможно, вы, ребята, можете указать мне правильное направление.

Я пытаюсь поставить цифровую подпись на веб-сервере в формате pdf через соединение https.

При загрузке страницы я делаю так:

HttpClientCertificate cs = Request.ClientCertificate;
X509Certificate card = new X509Certificate(cs.Certificate);
Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
 Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(card.GetRawCertData())};

Я получаю сообщение об ошибке "m_safeCertContext - недопустимый дескриптор" в последней строке кода.

Обратите внимание, что:

  • Я получаю ту же ошибку, используя 2 совершенно разных сертификата.
  • Сертификат извлекается в переменную "card" ok.
  • Раньше я получал карту для X509Certificate2, но вчера читал где-то, что не могу найти ошибку, которая может быть устранена путем преобразования в X509Certificate и затем понижением до X509Certificate2. Это был один из тех моментов "ну ... это не имеет никакого смысла, но я еще не пробовал" моменты.
  • Я попытался добавить свойство [System.Security.SecurityCritical, System.Security.SecurityTreatAsSafe] ко всем методам и даже к классу, чтобы посмотреть, сработает ли оно ... не повезло.

Кто-нибудь может дать мне подсказку?

Ответы [ 4 ]

11 голосов
/ 21 ноября 2013

Это может произойти каждый раз, когда вы получаете доступ к неинициализированным полям в криптографии.

В вашем коде, если Request.ClientCertificate возвращает объект без необработанных данных сертификата, вы увидите ошибку при вызове card.GetRawCertData() в четвертой строке.

В качестве простого теста попробуйте следующее:

var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2();
Console.WriteLine(cert.Thumbprint);

Это вызовет следующее исключение, потому что нет доступного отпечатка:

m_safeCertContext is an invalid handle.

с заданной трассировкой стека:

at System.Security.Cryptography.X509Certificates.X509Certificate.ThrowIfContextInvalid()
at System.Security.Cryptography.X509Certificates.X509Certificate.SetThumbprint()
at System.Security.Cryptography.X509Certificates.X509Certificate.GetCertHashString()
at System.Security.Cryptography.X509Certificates.X509Certificate2.get_Thumbprint()
at MyEncryptionUtility.EncryptionUtilityForm.button1_Click(Object sender, EventArgs e) in C:\MyEncryptionUtility\EncryptionUtilityForm.cs:line 2864
0 голосов
/ 16 декабря 2016
 public bool ReadCertFromSignedFile(X509Certificate2 cert, string filename)
    {
        if (!string.IsNullOrWhiteSpace(filename) && File.Exists(filename))
        {
            var cert509 = X509Certificate.CreateFromSignedFile(filename);
            cert = new X509Certificate2(cert509.GetRawCertData());

            return CheckSertificate(cert);
        }
        else
        { throw new Exception("Сертификат не заполнен"); }
    }

вызов метода из другого кода, подобного этому

   if (_digitalSignatureService.ReadCertFromSignedFile(fileCert, file.SignFilePath))
                 {
                    if (!cert.Equals(fileCert))
                    {

Равно - ошибка вызова "m_safeCertContext является недействительным дескриптором." потому что X509Сертификат не существует

решение

 public bool ReadCertFromSignedFile(X509Certificate2 cert, string filename)
    {
        if (!string.IsNullOrWhiteSpace(filename) && File.Exists(filename))
        {
            var cert509 = X509Certificate.CreateFromSignedFile(filename);

            cert.Import(cert509.GetRawCertData());

этот код работает!

0 голосов
/ 12 декабря 2016

Похоже, что это не ваша проблема, но для других: убедитесь, что вы не вызываете X509Certificate2.Reset (), прежде чем пытаться получить доступ к свойствам или методам, связанным с сертификатом.

0 голосов
/ 28 июня 2009

Во-первых, у вас есть стек?

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

...