我一直在努力解决问题,也许你们可以指出我正确的方向。
我正在尝试通过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是一个无效的句柄”。
请注意:
[System.Security.SecurityCritical, System.Security.SecurityTreatAsSafe]
属性添加到所有方法甚至类中以查看它是否可行...没有这样的运气。 任何人都可以给我一个暗示吗?
答案 0 :(得分:11)
只要您在加密中访问未初始化的字段,就会发生这种情况。
在您的代码中,如果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
答案 1 :(得分:0)
首先,你有一个堆栈吗?
其次,here有一篇文章我会尝试一下。帖子中提到的问题通常是证书相关问题的原因。
答案 2 :(得分:0)
看起来这不是你的问题,但对其他人来说:确保在尝试访问任何与证书相关的属性或方法之前,不要调用X509Certificate2.Reset()。
答案 3 :(得分:0)
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());
此代码有效!