【问题标题】:m_safeCertContext is an invalid handlem_safeCertContext 是无效句柄
【发布时间】:2010-10-01 08:32:44
【问题描述】:

我一直在努力解决一个问题,也许你们可以指出我正确的方向。

我正在尝试通过 https 连接在网络服务器上对 pdf 进行数字签名。

在页面加载时,我正在这样做:

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] 属性添加到所有方法甚至类中,以查看它是否可以工作......没有这样的运气。

谁能给我一个提示?

【问题讨论】:

  • 我遇到了类似的问题,然后我意识到我在证书被使用之前就将其处理掉了。您能否检查一下您的证书在使用之前是否没有直接或间接地被处理掉。
  • @Gurpreet;我认为您的评论对我有所帮助,而且我在 Asp.net Core Startup.cs 文件中使用了“使用”语句(与签署 pdf 无关)

标签: c# digital-signature digital-certificate


【解决方案1】:

这可能在您访问密码学中未初始化的字段时发生。

在您的代码中,如果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

【讨论】:

  • 我打电话给.HasPrivateKey 并得到同样的错误。所以它没有被初始化。那么如何检查它是否有私钥呢?
  • 我不确定@AaA。我会尝试在这里提出一个新问题。
【解决方案2】:

看起来这不是您的问题,但对其他人而言:确保在尝试访问任何与证书相关的属性或方法之前没有调用 X509Certificate2.Reset()。

【讨论】:

    【解决方案3】:
     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 是无效句柄”。因为 X509Certificate 不存在

    决定

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

    此代码有效!

    【讨论】:

      猜你喜欢
      • 2020-06-19
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多