Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Windows 7

Cách ký driver thiết bị không có chữ ký số trong Windows

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 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.

Lưu ý: Dù chứng chỉ có thời hạn, việc hết hạn của chứng chỉ CodeSigning chỉ có nghĩa là không thể tạo chữ ký mới. Độ hợp lệ của driver đã được ký bằng chứng chỉ này là không giới hạn (hoặc chữ ký cũ vẫn hợp lệ trong timestamp đã chỉ định).

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òng DriverVer = trong section [Version] của file .inf và thay bằng DriverVer=05/01/2009,9.9.9.9.
  • Lỗi Missing AMD64 CatalogFile entry (x64) hoặc Missing 32-bit CatalogFile entry: Thêm dòng CatalogFile=xg20gr.cat và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.

Lưu ý: Nếu chứng chỉ không tin cậy (chưa thêm vào Trusted Root Certificate Store), lệnh 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