C# m_safeCertContext是无效句柄

C# m_safeCertContext是无效句柄,c#,digital-signature,digital-certificate,C#,Digital Signature,Digital Certificate,我一直在努力解决一个问题,也许你们能给我指出正确的方向 我正在尝试通过https连接在Web服务器上对pdf进行数字签名 在页面加载时,我这样做: HttpClientCertificate cs = Request.ClientCertificate; X509Certificate card = new X509Certificate(cs.Certificate); Org.BouncyCastle.X509.X509CertificateParser cp = new Org.Bounc

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

我正在尝试通过https连接在Web服务器上对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是无效句柄”

请注意:

  • 我使用两个完全不同的证书得到相同的错误
  • 正在将证书检索到“card”变量ok
  • 我过去常常将卡转到X509Certificate2,但我昨天在某个地方读到,我找不到可以通过转换为X509Certificate2,然后向下转换到X509Certificate2来解决错误的方法。这是一个“嗯……这没有任何意义,但我还没有尝试过”的时刻
  • 我已尝试将
    [System.Security.SecurityCritical,System.Security.SecurityTreatAsSafe]
    属性添加到所有方法甚至类中,以查看它是否有效。。。没有这样的运气

有人能给我一个提示吗?

这可以在您访问加密中未初始化的字段时发生

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

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

 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());

这个代码有效

我正在呼叫
.HasPrivateKey
,收到相同的错误。所以它没有初始化。那么如何检查它是否有私钥呢?我不确定@AaA。我试着在这里问一个新问题。我也有类似的问题,然后我意识到我是在证书被使用之前处理掉的。您能检查一下您的证书在使用前是否没有直接或间接地被处置。@Gurpreet;我认为,你的评论对我很有帮助,我在Asp.net Core Startup.cs文件中使用了“using”语句(与签署PDF无关)