Mặc định, tất cả phiên bản Windows 64-bit ngăn cài đặt driver thiết bị không được ký bằng chữ ký số hợp lệ. Driver không chữ ký bị hệ điều hành chặn. Chữ ký số đảm bảo driver do nhà phát triển/nhà cung cấp uy tín phát hành và mã nguồn chưa bị sửa đổi.
Có nhiều cách tắt kiểm tra chữ ký driver cho driver không chữ ký trong Windows (dùng GPO, chế độ boot test, v.v.). Hôm nay chúng ta sẽ hướng dẫn ký bất kỳ driver không chữ ký nào cho Windows x64 (hướng dẫn áp dụng cho Windows 11, 10, 8.1 và 7).
Mục lục
- Tạo chứng chỉ tự ký cho driver
- Tạo file Catalog (CAT) để ký gói driver
- Ký gói driver với chứng chỉ tự ký
- Cài đặt driver tự ký trên Windows
- Driver User-Mode và Kernel-Mode trong Windows
Tạo chứng chỉ tự ký cho driver
Tạo thư mục C:\DriverCert tại gốc ổ hệ thống.
Sử dụng cmdlet PowerShell New-SelfSignedCertificate để tạo chứng chỉ ký mã. Ví dụ tạo chứng chỉ tự ký có hiệu lực 3 năm:
$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
$cert = New-SelfSignedCertificate -Subject "WOSHUB" -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My -notafter $add3year
Xuất chứng chỉ ra file .pfx với mật khẩu:
$CertPassword = ConvertTo-SecureString -String "P@ss0wrd" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath C:\DriverCert\myDrivers.pfx -Password $CertPassword
Vì chứng chỉ là tự ký, Windows không tin cậy mặc định. Khi kiểm tra kho chứng chỉ bằng công cụ Sigcheck, chứng chỉ sẽ hiển thị là không tin cậy, vì không nằm trong danh sách Microsoft Trusted Root Certificates (danh sách này cần cập nhật định kỳ).
Bây giờ cần thêm chứng chỉ vào kho Trusted Root và Trusted Publisher:
$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.FullName
Lưu ý: Trên các phiên bản Windows cũ hơn, phải dùng công cụ makecert.exe từ Windows SDK để tạo chứng chỉ tự ký. Quy trình phức tạp hơn (tạo .pvk, .cer, .spc, sau đó gộp thành .pfx bằng pvk2pfx).
Có thể triển khai trung tâm chứng chỉ này đến máy client qua Group Policy trong domain AD.
Mở snap-in quản lý chứng chỉ máy local (certlm.msc) và xác minh chứng chỉ của bạn nằm trong Trusted Publishers và Trusted Root Certification Authorities.
Tạo file Catalog (CAT) để ký gói driver
Tạo thư mục C:\DriverCert\xg20 và copy tất cả file từ thư mục giải nén driver ban đầu (c:\tools\drv1\). Đảm bảo có file .sys và .inf (trong ví dụ: xg20grp.sys và xg20gr.inf).
md C:\DriverCert\xg
xcopy c:\tools\drv1\ C:\DriverCert\xg /i /c /k /e /r /y
Chuyển đến thư mục chứa inf2cat.exe (từ Windows Driver Kit - WDK):
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86"
Tạo file CAT (chứa thông tin tất cả file trong gói driver) dựa trên file INF. Công cụ inf2cat.exe cho phép tạo file CAT cho nền tảng của bạn:
inf2cat.exe /driver:"C:\DriverCert\xg20" /os:7_X64 /verbose
Kiểm tra file C:\DriverCert\xg\xg20gr.cat đã xuất hiện và log hiển thị:
Signability test complete. Catalog generation complete.
Xử lý lỗi thường gặp:
- Lỗi
Signability test failed. Errors: 22.9.7: DriverVer set to incorrect date...: Tìm dòngDriverVer =trong section[Version]của file .inf và thay bằngDriverVer=05/01/2009,9.9.9.9. - Lỗi
Missing AMD64 CatalogFile entry(x64) hoặcMissing 32-bit CatalogFile entry: Thêm dòngCatalogFile=xg20gr.catvào section[Version]của file .inf.
Ký gói driver với chứng chỉ tự ký
Chuyển đến thư mục chứa signtool.exe (phiên bản x64):
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64"
Ký gói driver (tập file) với chứng chỉ đã tạo, dùng dịch vụ timestamp Verisign. Lệnh sau ký file CAT bằng chữ ký số dùng chứng chỉ trong file .pfx bảo vệ bằng mật khẩu:
signtool sign /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd /t https://timestamp.verisign.com/scripts/timstamp.dll /v C:\DriverCert\xg20\xg20gr.cat
Trên Windows 10/11 hiện đại, lệnh trên báo lỗi: SignTool Error: No file digest algorithm specified.... Cần dùng lệnh sau:
signtool sign /tr https://timestamp.digicert.com /td SHA256 /v /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd "C:\DriverCert\xg\xg20gr.cat"
Nếu gặp lỗi SignTool Error: An unexpected internal error has occurred hoặc Error information: SignerTimeStamp() failed. (-2147012865/0x80072eff), thử URL timestamp server khác:
https://timestamp.comodoca.com/authenticode https://timestamp.globalsign.com/scripts/timstamp.dll https://timestamp.verisign.com/scripts/timstamp.dll https://tsa.starfieldtech.com https://www.startssl.com/timestamp
Nếu ký thành công, thông báo:
Successfully signed: C:\DriverCert\xg\xg20gr.cat Number of files successfully Signed: 1
Chữ ký số của driver nằm trong file .cat được tham chiếu trong file .inf. Kiểm tra chữ ký số driver trong file cat:
SignTool verify /v /pa c:\DriverCert\xg\xg20gr.cat
Có thể xem thông tin chứng chỉ trong tab Digital Signatures của thuộc tính file CAT.
SignTool verify sẽ báo lỗi: SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
File CAT chứa chữ ký số (thumbprint) của tất cả file trong thư mục driver (file liệt kê trong section CopyFiles của file INF). Nếu bất kỳ file nào bị thay đổi, checksum sẽ không khớp với dữ liệu trong CAT, dẫn đến cài đặt driver thất bại.
Cài đặt driver tự ký trên Windows
Thử cài lại driver đã ký:
Pnputil –i –a C:\DriverCert\xg20\xg20gr.inf
Lúc này không còn cảnh báo thiếu chữ ký số driver.
Successfully installed the driver on a device on the system. Driver package added successfully.
Trên Windows 10/11 xuất hiện cảnh báo: Would you like to install this device software? → Nhấn "Install" để cài đặt gói driver.
Nếu cài đặt thất bại, xem log chi tiết tại C:\Windows\inf\setupapi.dev.log. Thường gặp lỗi "Driver package failed signature validation" → nghĩa là chứng chỉ driver chưa thêm vào kho chứng chỉ tin cậy.
Nếu thành công, file setupapi.dev.log sẽ chứa các dòng như sau:
>>> [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 ... <<< [Exit status: SUCCESS]
Driver User-Mode và Kernel-Mode trong Windows
Nhắc lại: driver trong Windows chạy ở kernel-mode hoặc user-mode. Driver kernel-mode ký cách này sẽ không load khi boot Windows trên thiết bị UEFI bật Secure Boot, lỗi:
Event ID: 7000 ERROR_DRIVER_BLOCKED 1275 (0x4FB) This driver has been blocked from loading.
Kiểm tra Secure Boot có bật không:
Confirm-SecureBootUEFI
Tất cả driver kernel-mode load với Secure Boot bật bắt buộc phải được ký trong quá trình chứng thực Microsoft (WHQL – Windows Hardware Quality Lab). Lý do: khi kernel load, UEFI không thể xác minh chứng chỉ trong kho chứng chỉ local machine của Windows.
SignTool Error: Signing Cert does not chain to a Microsoft Code Verification Root.
Microsoft yêu cầu chứng thực driver bên thứ ba bắt buộc theo Windows Hardware Compatibility Program kể từ Windows 10 1607.
Driver user-mode tự ký (thường là máy in, scanner, plotter, v.v.) sẽ hoạt động ngay cả khi Secure Boot bật.
Đối với driver kernel-mode, phải tắt kiểm tra chữ ký số và boot Windows ở test mode bằng bcdedit.exe:
bcdedit.exe /set /nointegritychecks on
bcdedit.exe /set testsigning ON