Firma de Authenticode para desarrolladores de juegos
La autenticación de datos es cada vez más importante para los desarrolladores de juegos. Windows Vista y Windows 7 tienen varias características, como controles parentales, que requieren que los juegos estén firmados correctamente para asegurarse de que nadie ha alterado los datos. Microsoft Authenticode permite a los usuarios finales y al sistema operativo comprobar que el código de programa procede del propietario correcto y de que no se ha alterado o dañado accidentalmente de forma malintencionada. En este artículo se describe cómo empezar a autenticar el juego y cómo integrar la autenticación en un proceso de compilación diario.
- Fondo
- Introducción
- Uso de una entidad de certificación de confianza
- Ejemplo de uso de un certificado de prueba
- Integración del inicio de sesión de código en el sistema de compilación diario
- Revocación
- Controladores de firma de código
- Resumen
- Más información
Nota:
A partir del 1 de enero de 2016, Windows 7 y versiones posteriores ya no confían en ningún certificado de firma de código SHA-1 con una fecha de expiración del 1 de enero de 2016 o posterior. Consulte Aplicación de Windows de la firma de código authenticode y la marca de tiempo para obtener más información.
Fondo
Los certificados digitales se usan para establecer la identidad del autor. Los certificados digitales los emite un tercero de confianza conocido como entidad de certificación (CA), como VeriSign o Thawte. La ENTIDAD de certificación es responsable de comprobar que el propietario no reclama una identificación falsa. Después de aplicar a una ENTIDAD de certificación para un certificado, los desarrolladores comerciales pueden esperar una respuesta a su aplicación en menos de dos semanas.
Después de que la ENTIDAD de certificación decida que cumple sus criterios de directiva, genera un certificado de firma de código que se ajusta a X.509, el formato de certificado estándar del sector creado por la Unión Internacional de Telecomunicaciones, con extensiones de la versión 3. Este certificado le identifica y contiene la clave pública. La ENTIDAD de certificación la almacena por referencia y se le proporciona una copia electrónicamente. Al mismo tiempo, también crea una clave privada que debe mantener a salvo y que no debe compartir con nadie, incluso la CA.
Después de tener una clave pública y privada, puede empezar a distribuir software firmado. Microsoft proporciona herramientas para hacerlo en Windows SDK. Las herramientas usan un hash unidireccional, generan un resumen de longitud fija y generan una firma cifrada con una clave privada. A continuación, combinan esa firma cifrada con el certificado y las credenciales en una estructura conocida como bloque de firma e insertan en el formato de archivo del ejecutable. Cualquier tipo de archivo binario ejecutable se puede firmar, incluidos archivos DLL, archivos ejecutables y archivos de gabinete.
La firma se puede comprobar de varias maneras. Los programas pueden llamar a la función CertVerifyCertificateChainPolicy y SignTool (signtool.exe) se pueden usar para comprobar una firma desde el símbolo de la línea de comandos. El Explorador de Windows también tiene una pestaña Firmas digitales en Propiedades de archivo que muestra cada certificado de un archivo binario firmado. (La pestaña Firmas digitales solo aparece en Propiedades de archivo para archivos firmados). Además, una aplicación puede comprobarse automáticamente mediante el uso de CertVerifyCertificateChainPolicy.
La firma authenticode no solo es útil para la autenticación de datos por parte de los usuarios finales, sino que también es necesaria para aplicar revisiones a cuentas de usuario limitadas y por controles parentales en Windows Vista y Windows 7. Además, las tecnologías futuras de los sistemas operativos Windows también pueden requerir que el código esté firmado, por lo que se recomienda encarecidamente que todos los desarrolladores profesionales y aficionados adquieran un certificado de firma de código de una ENTIDAD de certificación. Puede encontrar más información sobre cómo se hace esto más adelante en este artículo en Uso de una entidad de certificación de confianza.
El código de juego, los parcheadores y los instaladores pueden aprovechar aún más la firma authenticode comprobando que los archivos son auténticos en el código. Esto se puede usar para la seguridad de red general y anti-trampa. El código de ejemplo para comprobar si un archivo está firmado puede encontrarse aquí: Programa C de ejemplo: Comprobación de la firma de un archivo PE y código de ejemplo para comprobar la propiedad de un certificado de firma en un archivo firmado se puede encontrar aquí: Cómo obtener información de ejecutables firmados de Authenticode.
Introducción
Para empezar, Microsoft proporciona herramientas con Visual Studio 2005 y Visual Studio 2008, y en Windows SDK, para ayudar a realizar y comprobar el proceso de firma de código. Después de instalar Visual Studio o Windows SDK, las herramientas descritas en este artículo técnico se encuentran en un subdirectorio de la instalación, que puede incluir uno o varios de los siguientes elementos:
- %SystemDrive%\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Bin
- %SystemDrive%\Archivos de programa\Microsoft Visual Studio 8\VC\PlatformSDK\Bin
- %SystemDrive%\Archivos de programa\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\
- %SystemDrive%\Archivos de programa\Microsoft SDKs\Windows\v6.0A\bin\
Las siguientes herramientas son las más útiles para firmar código:
-
Herramienta de creación de certificados (MakeCert.exe)
-
Genera un certificado X.509 de prueba, como un archivo .cer, que contiene la clave pública y una clave privada, como un archivo .pvk. Este certificado solo se usa con fines de prueba internos y no se puede usar públicamente.
-
pvk2pfx.exe
-
Crea un archivo de intercambio de información personal (.pfx) a partir de un par de archivos .cer y .pvk. El archivo .pfx contiene la clave pública y privada.
-
SignTool (SignTool.exe)
-
Firma el archivo mediante el archivo .pfx. SignTool admite la firma de archivos DLL, archivos ejecutables, archivos de Windows Installer (.msi) y archivos de gabinete (.cab).
Nota:
Al leer otra documentación, es posible que encuentre referencias a SignCode (SignCode.exe), pero esta herramienta está en desuso y ya no se admite, use SignTool en su lugar.
Uso de una entidad de certificación de confianza
Para obtener un certificado de confianza, debe aplicar a una entidad de certificación (CA), como VeriSign o Thawte. Microsoft no recomienda ninguna ENTIDAD de certificación sobre otra, pero si desea integrar en el servicio Informe de errores de Windows (WER), debe considerar el uso de VeriSign para emitir el certificado, ya que el acceso a la base de datos WER requiere una cuenta de WinQual que requiera un identificador de VeriSign. Para obtener una lista completa de entidades de certificación de terceros de confianza, consulte Miembros del programa de certificados raíz de Microsoft. Para obtener más información sobre el registro con WER, vea "Introducción Informe de errores de Windows" en la zona isv.
Después de recibir el certificado de la ENTIDAD de certificación, puede firmar el programa mediante SignTool y liberar el programa al público. Sin embargo, debe tener cuidado de proteger la clave privada, que se encuentra en los archivos .pfx y .pvk. Asegúrese de mantener estos archivos en una ubicación segura.
Ejemplo de uso de un certificado de prueba
En los pasos siguientes se muestra la creación de un certificado de firma de código con fines de prueba, seguido de la firma de un programa de ejemplo de Direct3D (denominado BasicHLSL.exe) con este certificado de prueba. Este procedimiento crea .cer y archivos .pvk (las claves públicas y privadas, respectivamente), que no se pueden usar para la certificación pública.
En este ejemplo, también se agrega una marca de tiempo a la firma. Una marca de tiempo impide que la firma no sea válida cuando expire el certificado. El código firmado pero que carece de una marca de tiempo no se validará después de que expire el certificado. Por lo tanto, todo el código publicado públicamente debe tener una marca de tiempo.
Para crear un certificado y firmar un programa
Cree un certificado de prueba y una clave privada mediante la Herramienta de creación de certificados (MakeCert.exe).
En el siguiente ejemplo de línea de comandos se especifica MyPrivateKey como nombre de archivo para el archivo de clave privada (.pvk), MyPublicKey como nombre de archivo del certificado (.cer) y MySoftwareCompany como nombre del certificado. También hace que el certificado se autofirme, de modo que no tenga una entidad raíz que no sea de confianza.
MakeCert /n CN=MySoftwareCompany /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e 12-31-2020 /sv MyPrivateKey.pvk MyPublicKey.cer
Cree un archivo de intercambio de información personal (.pfx) a partir del archivo de clave privada (.pvk) y el archivo de certificado (.cer) mediante pvk2pfx.exe.
El archivo .pfx combina las claves públicas y privadas en un único archivo. En el ejemplo de línea de comandos siguiente se usan los archivos .pvk y .cer del paso anterior para crear el archivo .pfx denominado MyPFX con la contraseña your_password:
pvk2pfx.exe -pvk MyPrivateKey.pvk -spc MyPublicKey.cer -pfx MyPFX.pfx -po your_password
Firme su programa con su archivo de Intercambio de información personal (.pfx) mediante SignTool.
Puede especificar varias opciones en la línea de comandos. En el siguiente ejemplo de línea de comandos se usa el archivo .pfx del paso anterior, se proporciona your_password como contraseña, se especifica BasicHLSL como archivo que se va a firmar y se recupera una marca de tiempo de un servidor especificado:
signtool.exe sign /fd SHA256 /f MyPFX.pfx /p your_password /v /t URL_to_time_stamp_service BasicHLSL.exe
Nota:
La entidad de certificación proporciona la dirección URL al servicio de marca de tiempo y es opcional para las pruebas. Es importante que la firma de producción incluya una entidad de marca de tiempo válida o que la firma no se valide cuando expire el certificado.
Compruebe que el programa está firmado mediante SignTool.
En el siguiente ejemplo de línea de comandos se especifica que SignTool debe intentar comprobar la firma en BasicHLSL.exe mediante todos los métodos disponibles al proporcionar una salida detallada:
signtool.exe verify /a /v BasicHLSL.exe
En este ejemplo, SignTool debe indicar que el certificado está asociado, al tiempo que indica que no es de confianza, ya que no lo emite una ENTIDAD de certificación.
Confíe en el certificado de prueba.
Para los certificados de prueba, debe confiar en el certificado. Este paso debe omitirse para los certificados proporcionados por una ENTIDAD de certificación, ya que estos confiarán de forma predeterminada.
En solo los equipos en los que desea confiar en el certificado de prueba, ejecute lo siguiente:
certmgr.msc
A continuación, haga clic con el botón derecho en Entidades de certificación raíz de confianza y elija Todas las tareas | Importación. A continuación, vaya al archivo .pfx que creó y siga los pasos del asistente, colocando el certificado en las entidades de certificación raíz de confianza.
Cuando se complete el asistente, puede empezar a probar con el certificado de confianza en ese equipo.
Integración del inicio de sesión de código en el sistema de compilación diario
Para integrar el inicio de sesión de código en un proyecto, puede crear un archivo por lotes o un script para ejecutar las herramientas de línea de comandos. Una vez compilado el proyecto, ejecute SignTool con la configuración adecuada (como se muestra en el paso 3 de nuestro ejemplo).
Tenga especial cuidado en el proceso de compilación para asegurarse de que el acceso a los archivos .pfx y .pvk está restringido a los pocos equipos y usuarios posible. Como procedimiento recomendado, los desarrolladores solo deben firmar código mediante el certificado de prueba hasta que estén listos para enviarse. De nuevo, la clave privada (.pvk) debe mantenerse en una ubicación segura, como una sala segura o bloqueada, e idealmente en un dispositivo criptográfico, como una tarjeta inteligente.
Otra capa de protección se proporciona mediante Microsoft Authenticode para firmar el propio paquete de Windows Installer (MSI). Esto ayuda a proteger el paquete MSI contra alteraciones y daños accidentales. Consulte la documentación de la herramienta de creación de MSI para obtener más información sobre cómo firmar paquetes con Authenticode.
Revocación
En caso de que la seguridad de la clave privada esté en peligro o que algún evento relacionado con la seguridad represente un certificado de firma de código no válido, el desarrollador debe revocar el certificado. No hacerlo debilitaría la integridad del desarrollador y la eficacia del código de firma. Una ENTIDAD de certificación también puede emitir una revocación con un tiempo específico; el código firmado con una marca de tiempo antes del tiempo de revocación seguirá siendo válido, pero el código con una marca de tiempo posterior no será válido. La revocación de certificados afecta al código de las aplicaciones firmadas con el certificado revocado.
Controladores de firma de código
Los controladores pueden y deben estar firmados con Authenticode. Los controladores en modo kernel tienen requisitos adicionales: las ediciones de 64 bits de Windows Vista y Windows 7 impedirán la instalación de todos los controladores del modo kernel sin firmar y todas las versiones de Windows mostrarán un aviso de advertencia cuando un usuario intente instalar un controlador sin firmar. Además, los administradores pueden establecer la directiva de grupo para evitar que se instalen controladores sin firmar en Microsoft Windows Server 2003, Windows XP Professional x64 Edition y ediciones de 32 bits de Windows Vista y Windows 7.
Muchos tipos de controladores se pueden firmar con una firma de confianza de Microsoft, como parte del Programa de certificación de Windows de Windows Hardware Quality Labs (WHQL) o el Programa de firmas sin clasificar (anteriormente denominado Firma de confiabilidad de controladores), que permite al sistema confiar completamente en estos controladores e instalarlos incluso sin credenciales administrativas.
Como mínimo, los controladores deben estar firmados con Authenticode, ya que los controladores que no están firmados o autofirmados (es decir, firmados con un certificado de prueba) no se instalarán en muchas plataformas basadas en Windows. Para obtener más información sobre la firma de controladores y el código y la característica relacionada, consulte Requisitos de firma de controladores para Windows en Windows Hardware Developer Central.
Resumen
El uso de Microsoft Authenticode es un proceso sencillo. Una vez que haya obtenido una CER y creado una clave privada, es una cuestión sencilla de usar las herramientas proporcionadas por Microsoft. A continuación, puedes habilitar características importantes en Windows Vista y Windows 7, como controles parentales, e informar a los clientes de que tu producto proviene directamente de su propietario correcto.
Información adicional
Para obtener más información sobre las herramientas y los procesos relacionados con el código de firma, consulte los vínculos siguientes: