I faced the following issue.
I run the following code
var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);
in two processes. One of the processes runs under LOCAL_SYSTEM
and there this code succeeds. Another one runs inside IIS under a local user account belonging to "Users" local group and there I get the following exception:
System.Security.Cryptography.CryptographicException
Object was not found.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password)
//my code here
So I Googled a bit and found this answer to a kind of similar question. I tried to enable LoadUserProfile
for the application pool and it works now.
The problem is I don't get what exactly happens when I set LoadUserProfile
and what consequences that might have. I mean if it's a "good" thing then why it is not "on" by default and why is it there after all?
What exactly happens when I set LoadUserProfile
in IIS pool and what negative consequences can it have?
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
so a user profile isn't needed. – Steepnew X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)
which avoids writing the private key to the store and wont require administrative privileges on the server. – Shackleton