Ralentización en la carga de ensamblados firmados con un certificado

Hace poco hemos tenido un problema curioso en el grupo de desarrollo en el que trabajo actualmente.


Tenemos un servicio windows que sirve de host para servicios WCF. El servicio sin firmar nos funcionaba sin ningún problema pero los problemas empezaron cuando intentamos firmarlo digitalmente….con el ensamblado firmado no conseguíamos arrancar el servicio windows.


Constantemente obteníamos un error de timeout en el arranque. A esto hay que añadirle, que otros módulos hechos en C++ ( no manejado ) los firmábamos y nos funcionaban correctamente.


Aunque una vez explicado el problema puede tener su lógica, el tema nos llevó bastante tiempo y pruebas hasta que conseguimos dar con el problema, así que espero que si os encontráis en la misma situación os pueda ahorrar algo de tiempo.


La explicación es el siguiente….


Cuando el CLR carga un ensamblado firmado digitalmente con un certificado siempre intenta verificar la firma contra la entidad certificadora. El objetivo de esta comprobación es comprobar si el certificado está revocado o sigue siendo válido. 


El problema de esta comprobación es que supone un coste en el tiempo de carga del ensamblado y puede suponer varios segundos en la carga del mismo. La carga del ensamblado irá más lenta.


Con ensamblados .NET el CLR hace esta comprobación siempre. En cambio, el loader de Windows sólo hace esta comprobación en determinadas circunstancias, por ejemplo, con controles ActiveX. De aquí la diferencia entre nuestros módulos C++ y el ensamblado .NET.


Es importante comentar, que si la comprobación falla, el loader no rechaza el ensamblado y lo carga igualmente. Lo único que no se le dará son los permisos asociados al certificado en «PublisherIdentityPermission».


En nuestro caso, la comprobación fallaba porque nuestra conexión a Internet es a través de un proxy autenticado, por lo que no se podía conectarse a la entidad certificadora. Esto provocaba que el servicio tardase demasiado y diese un error de timeout. Si la aplicación fuese una aplicación windows o de consola sólo hubiéramos notado que la carga del servicio iba más lenta.


A través del fichero de configuración podemos llegar a deshabilitar esta comprobación:



<configuration>



<runtime>


<generatePublisherEvidence enabledfalse«/>


</runtime>



</configuration>


Si queremos usar esta opción con una aplicación que use el framework 2.0 tendréis que descargaros y aplicar este hotfix.  Con la versión 3.0 SP1 o con la versión 3.5 del Framework no es necesario hacer nada adicional.

Ibon Landa

bon Landa lleva más de 15 años dedicado al desarrollo de software. Durante este tiempo ha trabajado en diferentes empresas en las cuáles ha podido trabajar en diferentes entornos y tecnologías. Actualmente está focalizado principalmente en tareas de desarrollo, arquitectura, en las herramientas del ciclo de vida y en todo lo relacionado con la plataforma de Cloud Computing Microsoft Azure, área en el que ha sido reconocido como MVP. Participa de forma activa en la comunidad, escribiendo su blog, manteniendo un portal sobre Microsoft Azure y colaborando con Microsoft y grupos de usuarios en eventos de formación, talleres y giras de producto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *