我一直在努力解决一个问题,也许你们可以为我指明正确的方向。
我正在尝试通过 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 是无效句柄”。
请注意:
- 我使用两个完全不同的证书遇到相同的错误。
- 证书正在被检索到“card”变量中。
- 我曾经将卡获取到 X509Certificate2,但我昨天在某处读到,我无法发现可以通过转换为 X509Certificate 然后向下转换为 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)