Me enfrenté al siguiente problema.
Ejecuto el siguiente código
var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);
en dos procesos. Uno de los procesos se ejecuta LOCAL_SYSTEM
y allí este código tiene éxito. Otro se ejecuta dentro de IIS bajo una cuenta de usuario local que pertenece al grupo local "Usuarios" y allí obtengo la siguiente excepción:
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
Así que busqué en Google un poco y encontré esta respuesta a una pregunta similar. Intenté habilitar LoadUserProfile
para el grupo de aplicaciones y ahora funciona.
El problema es que no entiendo qué sucede exactamente cuando establezco LoadUserProfile
y qué consecuencias podría tener. Quiero decir, si es algo "bueno", ¿por qué no está "activado" por defecto y por qué está ahí después de todo?
¿Qué sucede exactamente cuando configuro el LoadUserProfile
grupo IIS y qué consecuencias negativas puede tener?
new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)
que evita escribir la clave privada en la tienda y no requerirá privilegios administrativos en el servidor.
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
que no necesite un perfil de usuario.