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?
fuente
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
que no necesite un perfil de usuario.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.Respuestas:
IIS 6 nunca cargó perfiles de usuario. Asumiría que esto está desactivado de forma predeterminada para mantener el comportamiento constante, y un administrador debe optar por ello.
Lo más probable es que esto se deba a que el proveedor de servicios criptográficos de Windows estaba intentando almacenar o cargar una clave para su certificado en el almacén de usuarios y, dado que no había un perfil disponible, no había un contexto criptográfico disponible. Tenga en cuenta que la
Load User Profile
configuración solo se aplica a las cuentas de usuario. Las cuentas de servicio como NETWORK SERVICE y ApplicationPoolIdentity tienen un manejo especial.Bueno, el perfil de usuario está cargado. Esto incluye su almacén criptográfico, variables de entorno como% TEMP% y otras.
A lo que finalmente se reduce
LoadUserProfile
es a que IIS lo llama cuando se inicia AppPool.Puede romper la compatibilidad con versiones anteriores con una aplicación que se ejecutó en IIS 6, que no cargó el perfil de usuario. Se cargan las variables de entorno. Por ejemplo, cuando Cargar perfil de usuario es verdadero, la variable de entorno% TEMP% es
C:\Users\AccountName\AppData\Local\Temp
(por ejemplo). Cuando es falso, lo esC:\WINDOWS\Temp
.fuente
LoadUserProfile=true
en IIS y cambiar la ubicación de la carpeta temporal predeterminada% TEMP% desdeC:\Users\C:\Users\AccountName\AppData\Local\Temp
otro lugar? ejemplo "D: \ AppTempData"