C# m_safeCertContext是无效句柄
我一直在努力解决一个问题,也许你们能给我指出正确的方向 我正在尝试通过https连接在Web服务器上对pdf进行数字签名 在页面加载时,我这样做: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
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无关)