Tengo un servicio web ASP.NET que recibe una matriz de bytes que representa el contenido de un archivo .pfx
que contiene un certificado X.509. El código del lado del servidor utiliza el constructor System.Security.Cryptography.X509Certificate2
para cargar el certificado de la bytes:¿Por qué X509Certificate2 a veces no se puede crear desde un blob?
X509Certificate2 native_cert = new X509Certificate2(
pkcs12_buf /*byte array*/,
password,
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable
);
Dependiendo de quién es mi proceso de servicio se está ejecutando como, esta llamada ya sea éxito o fallar con una excepción "error interno" . La última llamada en la pila de excepción es X509Utils._LoadCertFromBlob
, que es código no administrado en mscore.dll
.
Este código tiene éxito cuando se ejecuta desde una aplicación de consola en un inicio de sesión interactivo utilizando las credenciales de la cuenta de servicio. No funciona cuando se ejecuta en w3wp.exe
en un grupo de aplicaciones que utiliza las credenciales de la cuenta de servicio. Cambiar la identidad del grupo de aplicaciones a un administrador soluciona el problema, por lo que debe ser un problema de privilegio, pero no tengo idea de qué privilegio podría ser necesario para esto. El código no toca ni el sistema de archivos ni los almacenes de certificados de Windows.
[ACTUALIZACIÓN: Más Información]
Este error aparece en el registro de sucesos de Windows:
*Cryptographic Parameters:*
**Provider Name:** Microsoft Software Key Storage Provider
**Algorithm Name:** Not Available.
**Key Name:** {E182E13B-166D-472A-A24A-CBEF0808E9ED}
**Key Type:** User key.
*Cryptographic Operation:*
**Operation:** Open Key.
**Return Code:** 0x2
¿Alguna idea?
¿Por qué el contexto del usuario ASP.Net en el que se ejecuta no tiene acceso a su propia tienda? (Esto resolvió mi problema, era un clásico "¡pero funciona en mi máquina de desarrollo! Simplemente me interesa el razonamiento"). – DFTR