Cómo firmar un controlador de dispositivo sin firmar en Windows
De forma predeterminada, todas las versiones de Windows de 64 bits impiden la instalación de controladores de dispositivos que no estén firmados con una firma digital válida. Los controladores no firmados están bloqueados por el sistema operativo. Una firma digital garantiza que el controlador haya sido publicado por un desarrollador o proveedor de confianza y que su código no haya sido modificado.
Hay varias formas de deshabilitar la verificación de la firma del controlador para los controladores no firmados en Windows (usando un GPO, un modo de inicio de prueba, etc.). Hoy mostraremos cómo firmar cualquier controlador sin firmar para Windows x64 (la guía se aplica a Windows 11, 10, 8.1 y 7).
Suponga que tiene un determinado controlador de dispositivo sin firmar (sin firma digital) para Windows 10 x64. En este ejemplo, es el controlador de una tarjeta gráfica bastante antigua. El archivo con los controladores para su versión de Windows se descargó del sitio web del proveedor (pude encontrar la versión del controlador de video solo para Windows Vista x64) y su contenido se extrajo a c: ools\drv1\. Intentemos instalar el controlador agregándolo a la tienda de controladores de Windows con una herramienta pnputil integrada:
Pnputil -a c:\tools\drv1\xg20gr.infNota. Este comando y todos los siguientes deben ejecutarse en el símbolo del sistema como administrador.
Durante la instalación del controlador, Windows 7 muestra una advertencia de que el sistema operativo no puede verificar la firma digital de este controlador:
Windows can’t verify the publisher of this driver software.
En Windows 10 (21H2) no aparece este aviso, pero aparece un error en la consola:
Processing inf: xg20gr.inf
Adding the driver package failed: The third-party INF does not contain digital signature information.Si hace clic con el botón derecho en el archivo del controlador inf y selecciona Instalar al instalar un controlador desde el Explorador de archivos, recibirá un error:
The third-party INF does not contain digital signature information.Intentemos firmar este controlador con un certificado autofirmado.
Para generar una firma y firmar el controlador, debe descargar e instalar las siguientes herramientas de desarrollo de aplicaciones de Windows:
Windows SDK (Kit de desarrollo de software) o Microsoft Visual Studio 2005+ para su versión de Windows. Instale el paquete Herramientas de firma del SDK de Windows para escritorio que contiene el
signtool.exe;
Kit de controladores de Windows (WDK): https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
Consejo. Antes de instalar estas herramientas, asegúrese de que .NET Framework 4 esté instalado en su computadora.
Crear un certificado de conductor autofirmado
Cree una carpeta C:\DriverCert en la raíz de la unidad del sistema.
Puede usar el cmdlet de PowerShell New-SelfSifgnedCertificate para crear un certificado de firma de código. En este ejemplo, crearemos un certificado autofirmado con un período de validez de 3 años.
$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
$cert = New-SelfSignedCertificate -Subject "WOSHUB” -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My -notafter $add3yearLuego, debe exportar este certificado a un archivo pfx con una contraseña:
$CertPassword = ConvertTo-SecureString -String “P@ss0wrd” -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath C:\DriverCert\myDrivers.pfx -Password $CertPasswordDado que el certificado que creamos está autofirmado, Windows no confía en él de forma predeterminada. Cuando verifique el almacén de certificados con la utilidad Sigcheck, este certificado se mostrará como no confiable, porque no figura en la lista de certificados raíz confiables de Microsoft (esta lista debe actualizarse periódicamente).
Ahora debe agregar el certificado al almacén raíz de confianza y a los certificados de editor de confianza:
$certFile = Export-Certificate -Cert $cert -FilePath C:\DriverCert\drivecert.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName
Import-Certificate -CertStoreLocation Cert:\LocalMachine\TrustedPublisher -FilePath $certFile.FullNameEn versiones anteriores de Windows, debe utilizar el
makecert.exe
herramienta del Kit de desarrollo de software (SDK) de Windows para generar certificados autofirmados. En este caso, los comandos para crear un certificado se verán así:
cd “C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\bin”Cree un certificado autofirmado y una clave privada, que se emite, por ejemplo, para la empresa WinOSHub:
makecert -r -sv C:\DriverCert\myDrivers.pvk -n CN="WinOSHub" C:\DriverCert\myDrivers.cerDurante la creación del certificado, la herramienta le pedirá que especifique una contraseña para la clave. Que sea P@ss0wrd.
Cree una clave pública para un certificado de editor (PKSC) que hemos creado anteriormente:
cert2spc C:\DriverCert\myDrivers.cer C:\DriverCert\myDrivers.spcCombine la clave pública (.spc) y la clave privada (.pvk) en un solo archivo de certificado con formato Intercambio de información personal (.pfx):
pvk2pfx -pvk C:\DriverCert\myDrivers.pvk -pi P@ss0wrd -spc C:\DriverCert\myDrivers.spc -pfx C:\DriverCert\myDrivers.pfx -po P@ss0wrdAgregue el certificado a confiable:
certmgr.exe -add C:\DriverCert\myDrivers.cer -s -r localMachine ROOT
certmgr.exe -add C:\DriverCert\myDrivers.cer -s -r localMachine TRUSTEDPUBLISHERPuede implementar este certificado de forma centralizada en los equipos cliente mediante la directiva de grupo en un dominio de AD.
Abra el complemento de administración de certificados local de la máquina (
certlm.msc) y verifique que su certificado esté en los Editores de confianza y las Autoridades de certificación raíz de confianza.
Nota. Aunque el certificado tiene un período de validez limitado, la caducidad del certificado CodeSigning significa que no puede crear nuevas firmas. La validez del conductor ya firmado por este certificado es ilimitada (o las firmas antiguas son válidas durante el sello de tiempo especificado).
Creación de un archivo de catálogo (CAT) para firmar un paquete de controladores
Cree el directorio C:\DriverCert\xg20 y copie todos los archivos de la carpeta en la que se extrajo originalmente el controlador del archivo (
c:\tools\drv1\). Asegúrese de que entre estos archivos haya archivos con las extensiones .sys y .inf (en nuestro caso, son xg20grp.sys y xg20gr.inf).
md C:\DriverCert\xg
xcopy c:\tools\drv1\ C:\DriverCert\xg /i /c /k /e /r /yIr al directorio:
cd “C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86”Genere un archivo CAT (que contiene información sobre todos los archivos del paquete del controlador) sobre la base del archivo INF. La herramienta inf2cat.exe (del Kit de controladores de Windows, WDK) le permite generar un archivo CAT para su plataforma:
inf2cat.exe /driver:"C:\DriverCert\xg20" /os:7_X64 /verbosePara asegurarse de que el procedimiento ha sido correcto, compruebe que en el directorio de destino ha aparecido el archivo C:\DriverCert\xg\xg20gr.cat y que hay mensajes en el registro:
Signability test complete.y
Catalog generation complete.Nota. En mi caso el comando Inf2Cat.exe devolvió un error:
Signability test failed.
Errors:
22.9.7: DriverVer set to incorrect date (must be postdated to 4/21/2009 for newest OS) in \hdx861a.infPara corregir el error, busque la línea con DriverVer=en el
[Version]sección y reemplácela con:
DriverVer=05/01/2009,9.9.9.9Si obtiene un error
Missing AMD64 CatalogFile entry(para x64) o
Missing 32-bit CatalogFile entry, luego agregue la línea CatalogFile=xg20gr.cat a la sección [Versión] del archivo .inf.
Firma del paquete de controladores con un certificado autofirmado
Vaya a la siguiente carpeta:
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64"Firme el paquete de controladores (conjunto de archivos) con el certificado que creó anteriormente usando Verisign como un servicio de marca de tiempo. El siguiente comando firmará el archivo CAT con una firma digital utilizando un certificado almacenado en un archivo .pfx protegido con contraseña:
signtool sign /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd /t http://timestamp.verisign.com/scripts/timstamp.dll /v C:\DriverCert\xg20\xg20gr.catEn las versiones modernas de Windows 10 y Windows 11, ejecutar este comando generará un error:
SignTool Error: No file digest algorithm specified. Please specify the digest algorithm with the /fd flag. Using /fd SHA256 is recommended and more secure than SHA1. Calling signtool with /fd sha1 is equivalent to the previous behavior. In order to select the hash algorithm used in the signing certificate's signature, use the /fd certHash option.Necesitas usar otro comando:
signtool sign /tr http://timestamp.digicert.com /td SHA256 /v /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd "C:\DriverCert\xg\xg20gr.cat"Si el comando devuelve un error
SignTool Error: An unexpected internal error has occurred, o
Error information: SignerTimeStamp() failed. (-2147012865/0x80072eff), pruebe con una URL de servidor de marca de tiempo diferente. Prueba cualquiera de la lista:
http://timestamp.comodoca.com/authenticode
http://timestamp.globalsign.com/scripts/timstamp.dll
http://timestamp.verisign.com/scripts/timstamp.dll
http://tsa.starfieldtech.com
http://www.startssl.com/timestampSi el archivo CAT se firma con éxito, debería aparecer el siguiente mensaje:
Successfully signed: C:\DriverCert\xg\xg20gr.cat
Number of files successfully Signed: 1La firma digital del controlador se encuentra en el archivo .cat al que se hace referencia en el archivo .inf. Puede verificar la firma digital del controlador en el archivo cat usando el siguiente comando:
SignTool verify /v /pa c:\DriverCert\xg\xg20gr.catTambién puede ver información sobre el certificado en las propiedades del archivo CAT en la pestaña Firmas digitales.
Si el certificado no es de confianza (o no se ha agregado al almacén de certificados raíz de confianza), aparecerá un error al ejecutar el
SignTool verifydominio:
SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.El archivo CAT contiene firmas digitales (huellas digitales) de todos los archivos que se encuentran en el directorio del controlador (archivos enumerados en el archivo INF en la sección CopyFiles). Si alguno de estos archivos se ha modificado, la suma de comprobación de los archivos no coincidirá con los datos del archivo CAT y, como resultado, la instalación de dicho controlador fallará.
Instalación de un controlador autofirmado en Windows
Intente instalar el controlador que hemos firmado nuevamente usando el comando:
Pnputil -i -a C:\DriverCert\xg20\xg20gr.infAhora no verá la advertencia sobre la falta de la firma digital del controlador.
Successfully installed the driver on a device on the system.
Driver package added successfully.Aparece la siguiente advertencia en Windows 10 y 11:
Would you like to install this device software?Haga clic en "Instalar" para instalar el paquete de controladores en Windows.
Si por alguna razón el controlador no está instalado, se incluye un registro detallado de la instalación del controlador en el archivo C:\Windows\inf\setupapi.dev.log. Este archivo de registro le permite obtener más información sobre los errores de instalación del controlador. En la mayoría de los casos, aparece el error "El paquete de controladores falló en la validación de la firma". Lo más probable es que esto signifique que el certificado del controlador no se agrega al almacén de certificados de confianza.
Si la instalación del controlador fue exitosa, el
setupapi.dev.logEl archivo debe contener las siguientes líneas:
>>> [Device Install (DiInstallDriver) - C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf]
>>> Section start 2018/07/22 23:32:57.015
cmd: Pnputil -i -a c:\DriverCert\xg\xg20gr.inf
ndv: Flags: 0x00000000
ndv: INF path: C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf
inf: {SetupCopyOEMInf: C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf} 13:23:37.046
inf: Copy style: 0x00000000
inf: Driver Store Path: C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf
inf: Published Inf Path: C:\WINDOWS\INF\oem23.inf
inf: {SetupCopyOEMInf exit (0x00000000)} 13:23:37.077
<<< Section end 2018/07/22 13:23:37.155
<<< [Exit status: SUCCESS]Controladores en modo usuario y modo kernel en Windows
Permítanme recordarles que en Windows el controlador se puede ejecutar en modo kernel o en modo usuario. Los controladores en modo kernel firmados de esta manera no se cargarán cuando Windows se inicie en el dispositivo UEFI con el Arranque seguro habilitado con el error:
Event ID: 7000
ERROR_DRIVER_BLOCKED
1275 (0x4FB)
This driver has been blocked from loading.Puede verificar si el modo de arranque seguro está habilitado usando el comando PowerShell:
Confirm-SecureBootUEFITodos los controladores en modo kernel cargados con SecureBoot habilitado deben firmarse durante el proceso de certificación de Microsoft (WHQL - Laboratorio de calidad de hardware de Windows). El motivo es que cuando se carga el kernel, UEFI no puede verificar los certificados en el almacén de certificados de la máquina local de Windows.
SignTool Error: Signing Cert does not chain to a Microsoft Code Verification Root.Microsoft requiere una certificación de controlador de terceros obligatoria según el Programa de compatibilidad de hardware de Windows a partir de Windows 10 1607.
Los controladores de modo de usuario autofirmados (generalmente impresoras, escáneres, trazadores, etc.) funcionarán incluso con SecureBoot habilitado.
Para los controladores de modo kernel, deberá desactivar la verificación de firma digital e iniciar Windows en modo de prueba con los comandos bcdedit.exe:
bcdedit.exe /set /nointegritychecks on
bcdedit.exe /set testsigning ON
















