I've been wrestling with a problem, maybe you guys can point me in the right direction.
I'm trying to digitally sign a pdf, on the webserver, over an https connection.
At page load i'm doing as so:
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())};
I'm getting the error "m_safeCertContext is an invalid handle" at that last line of code.
Please note that:
[System.Security.SecurityCritical, System.Security.SecurityTreatAsSafe]
property to all methods and even the class to see if it would work... no such luck. Can anyone one give me a hint?
This can happen any time you access uninitialized fields in cryptography.
In your code, if Request.ClientCertificate
returns an object with no raw certificate data then you will see the error when you call card.GetRawCertData()
on your fourth line.
As a simple test, try the following:
var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2();
Console.WriteLine(cert.Thumbprint);
This will throw the following exception because there is no thumbprint available:
m_safeCertContext is an invalid handle.
with the given stack trace:
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