code .net service code-signing

.net - code signing certificate free



Los ensambles firmados impiden que mi servicio se inicie (3)

Authenticode la firma de sus ensamblajes puede tener un efecto muy negativo en el arranque en frío. Vea este artículo de KB para más detalles.

http://support.microsoft.com/default.aspx/kb/936707

Cuando firmo los ensamblados en mi servicio con el signtool.exe de Verisign, no se inicia cuando se inicia el equipo, en un equipo que ejecuta Windows 2003 Server. El registro de eventos tiene dos eventos:

"Tiempo de espera (30000 milisegundos) esperando que se conecte el servicio de servicio xxx". y "El servicio xxx Service no pudo iniciarse debido al siguiente error: el servicio no respondió a la solicitud de inicio o control de manera oportuna".

Comienza bien una vez que la máquina está funcionando. Comienza bien en XP y Vista. Comienza bien cuando los ensamblajes están sin firmar.


Este problema es muy común para ejecutables de servicio .NET firmados: el servicio no se iniciará en el momento del arranque, pero se ejecutará correctamente cuando se inicie manualmente después. Si se usa ServiceBase.RequestAdditionalTime es irrelevante: de hecho, ningún código de usuario se ejecuta en absoluto antes de que la solicitud de inicio del servicio expire. Este efecto es aún más pronunciado en máquinas sin conectividad a Internet: en ese caso, incluso el inicio manual del servicio desde el SCM fallará.

Para resolver este problema, deshabilite la verificación de la firma de Authenticode en el momento de la carga para crear pruebas de Publisher , agregando los siguientes elementos a su archivo .exe.config:

<configuration> <runtime> <generatePublisherEvidence enabled="false"/> </runtime> </configuration>

La evidencia del editor es una característica de seguridad de acceso a código (CAS, por sus siglas en inglés) poco utilizada: solo si su servicio depende de PublisherMembershipCondition, deshabilitarlo ocasionará problemas. En todos los demás casos, las fallas de inicio permanentes o intermitentes desaparecerán, al no requerir más el tiempo de ejecución para realizar costosas comprobaciones de certificados (incluidas las búsquedas de listas de revocación).

Edición, julio de 2010: para las aplicaciones que usan la versión 4.0 de .NET Framework, esta solución ya no es necesaria.


Como dijo spacedog, Authenticode puede tener un mal impacto en el tiempo de inicio. Entonces, la pregunta es ¿qué estás firmando? Debería ser suficiente para que Authenticode firme solo su ejecutable de servicio, que a su vez solo debe hacer referencia a los ensamblajes nombrados fuertes. Por lo tanto, la sobrecarga de verificar la firma de Authenticode.

Puede instalar sus ensamblajes en el GAC, si es posible, esto aumentará ligeramente el rendimiento de inicio porque se omite la validación de nombre fuerte (consulte Authenticode and Assemblies ) y / o también puede ngen sus ensamblajes si el tiempo de inicio todavía es un problema.

Desde la respuesta al tiempo de espera de inicio del servicio de Windows por Romulo A. Ceccon:

Es una buena práctica terminar de comenzar su servicio lo más rápido posible. Por lo tanto, durante el estado de inicio, haga solo lo que necesita para reconocer que se inició correctamente; y haz el resto más tarde. Si el inicio es un proceso largo, use SetServiceStatus periódicamente para informar al Administrador de control de servicios que aún no ha finalizado, por lo que no interrumpe el tiempo de espera de su servicio.

Además de SetServiceStatus , también podría intentar decirle al Administrador de control de servicios (SCM) que el servicio necesita tiempo adicional para iniciar llamando a ServiceBase.RequestAdditionalTime .