Eu enfrentei o seguinte problema.
Eu executo o seguinte código
var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);
em dois processos. Um dos processos é executado LOCAL_SYSTEM
e aí este código é bem-sucedido. Outro é executado dentro do IIS em uma conta de usuário local pertencente ao grupo local "Usuários" e aí recebo a seguinte exceção:
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
Então eu pesquisei um pouco no Google e encontrei essa resposta para um tipo de pergunta semelhante. Tentei habilitar LoadUserProfile
para o pool de aplicativos e agora funciona.
O problema é que não entendo o que exatamente acontece quando defino LoadUserProfile
e quais consequências isso pode ter. Quero dizer, se é uma coisa "boa", por que não está "ativado" por padrão e por que está lá afinal?
O que exatamente acontece quando eu configuro LoadUserProfile
no pool IIS e quais consequências negativas isso pode ter?
new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)
que evita gravar a chave privada no armazenamento e não exigirá privilégios administrativos no servidor.
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
forma que um perfil de usuário não seja necessário.