기본적으로 모든 64비트 Windows 버전은 유효한 디지털 서명으로 서명되지 않은 장치 드라이버의 설치를 방지합니다. 서명되지 않은 드라이버는 운영 체제에 의해 차단됩니다. 디지털 서명은 드라이버가 신뢰할 수 있는 개발자 또는 공급업체에 의해 릴리스되었으며 해당 코드가 수정되지 않았음을 보장합니다.
Windows에서 서명되지 않은 드라이버에 대한 드라이버 서명 확인을 비활성화하는 방법에는 여러 가지가 있습니다(GPO, 테스트 부팅 모드 등 사용). 오늘은 Windows x64용 서명되지 않은 드라이버에 서명 하는 방법을 보여 드리겠습니다. (이 가이드는 Windows 11, 10, 8.1, 7에 적용됩니다.)
내용:
- 자체 서명된 드라이버 인증서 생성
- 드라이버 패키지 서명을 위한 카탈로그 파일(CAT) 생성
- 자체 서명된 인증서로 드라이버 패키지 서명
- Windows에 자체 서명된 드라이버 설치
- Windows의 사용자 모드 및 커널 모드 드라이버
Windows 10 x64용 특정 서명되지 않은 장치 드라이버(디지털 서명 없음)가 있다고 가정합니다. 이 예에서는 꽤 오래된 그래픽 카드용 드라이버입니다. 귀하의 Windows 버전용 드라이버가 포함된 아카이브는 공급업체 웹 사이트에서 다운로드되었으며(Windows Vista x64용 비디오 드라이버 버전만 찾을 수 있음) 해당 내용은 c:\tools\drv1\엠> . 내장된 pnputil을 사용하여 Windows 드라이버 저장소에 드라이버를 추가하여 드라이버를 설치해 보겠습니다. 도구:Pnputil –a c:\tools\drv1\xg20gr.inf
드라이버를 설치하는 동안 Windows 7은 운영 체제에서 이 드라이버의 디지털 서명을 확인할 수 없다는 경고를 표시합니다.
Windows에서 이 드라이버 소프트웨어의 게시자를 확인할 수 없습니다.
Windows 10(21H2)에서는 이 경고가 나타나지 않지만 콘솔에 오류가 나타납니다.
inf 처리:xg20gr.inf드라이버 패키지 추가 실패:타사 INF에 디지털 서명 정보가 없습니다.
inf 드라이버 파일을 마우스 오른쪽 버튼으로 클릭하고 설치 를 선택하면 파일 탐색기에서 드라이버를 설치할 때 다음 오류가 표시됩니다.
타사 INF에는 디지털 서명 정보가 포함되어 있지 않습니다.
자체 서명된 인증서로 이 드라이버에 서명해 보겠습니다.
서명을 생성하고 드라이버에 서명하려면 다음 Windows 응용 프로그램 개발 도구를 다운로드하여 설치해야 합니다.
- Windows SDK (소프트웨어 개발 키트) 또는 Windows 버전용 Microsoft Visual Studio 2005+. 데스크톱용 Windows SDK 서명 도구 설치
signtool.exe
가 포함된 패키지; - Windows 드라이버 키트(WDK) — https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
자체 서명된 드라이버 인증서 만들기
시스템 드라이브의 루트에 C:\DriverCert 폴더를 만듭니다.
New-SelfSifgnedCertificate PowerShell cmdlet을 사용하여 코드 서명 인증서를 만들 수 있습니다. 이 예에서는 유효 기간이 3년인 자체 서명된 인증서를 생성합니다.
$todaydate = Get-Date
이후
$add3year = $todaydate.AddYears(3)
$cert = New-SelfSignedCertificate -Subject "WOSHUB” -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My -notafter $add3year
그런 다음 이 인증서를 비밀번호가 있는 pfx 파일로 내보내야 합니다.
$CertPassword = ConvertTo-SecureString -String “P@ss0wrd” -Force –AsPlainText
Export-PfxCertificate -Cert $cert -FilePath C:\DriverCert\myDrivers.pfx -Password $CertPassword
우리가 만든 인증서는 자체 서명되었기 때문에 Windows는 기본적으로 인증서를 신뢰하지 않습니다. Sigcheck 유틸리티를 사용하여 인증서 저장소를 확인할 때 이 인증서는 신뢰할 수 없는 것으로 표시됩니다. 이 인증서는 Microsoft 신뢰할 수 있는 루트 인증서 목록에 없기 때문입니다(이 목록은 주기적으로 업데이트해야 함).
이제 신뢰할 수 있는 루트 저장소와 신뢰할 수 있는 게시자 인증서에 인증서를 추가해야 합니다.
$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
이전 버전의 Windows에서는 makecert.exe
를 사용해야 합니다. Windows SDK(소프트웨어 개발 키트)의 도구를 사용하여 자체 서명된 인증서를 생성합니다. 이 경우 인증서를 만드는 명령은 다음과 같습니다.
cd “C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\bin”
예를 들어 WinOSHub 회사에 대해 발급된 자체 서명된 인증서 및 개인 키를 만듭니다.
makecert -r -sv C:\DriverCert\myDrivers.pvk -n CN="WinOSHub" C:\DriverCert\myDrivers.cer
인증서를 만드는 동안 도구는 키에 대한 암호를 지정하라는 메시지를 표시합니다. P@ss0wrd로 설정 .
이전에 생성한 게시자 인증서(PKSC)에 대한 공개 키 생성:
cert2spc C:\DriverCert\myDrivers.cer C:\DriverCert\myDrivers.spc
공개 키(.spc)와 개인 키(.pvk)를 개인 정보 교환(.pfx) 형식의 단일 인증서 파일에 결합:
pvk2pfx -pvk C:\DriverCert\myDrivers.pvk -pi P@ss0wrd -spc C:\DriverCert\myDrivers.spc -pfx C:\DriverCert\myDrivers.pfx -po P@ss0wrd
신뢰할 수 있는 인증서 추가:
certmgr.exe -add C:\DriverCert\myDrivers.cer -s -r localMachine ROOT
certmgr.exe -add C:\DriverCert\myDrivers.cer -s -r localMachine TRUSTEDPUBLISHER
AD 도메인의 그룹 정책을 사용하여 이 인증서를 클라이언트 컴퓨터에 중앙에서 배포할 수 있습니다.
컴퓨터의 로컬 인증서 관리 스냅인(certlm.msc
) 인증서가 신뢰할 수 있는 게시자 및 신뢰할 수 있는 루트 인증 기관에 있는지 확인합니다.
참고 . 인증서의 유효 기간은 제한되어 있지만 CodeSigning 인증서가 만료되면 새 서명을 생성할 수 없습니다. 이 인증서로 이미 서명된 드라이버의 유효성은 무제한입니다(또는 이전 서명이 지정된 타임스탬프 동안 유효함).
드라이버 패키지 서명을 위한 카탈로그 파일(CAT) 생성
C:\DriverCert\xg20 디렉터리를 만듭니다. 아카이브의 드라이버가 원래 추출된 폴더의 모든 파일을 복사합니다(c:\tools\drv1\
). 확장자가 .sys인 파일이 있는지 확인합니다. 및 .inf 이 파일들 중(이 경우 xg20grp.sys 및 xg20gr.inf).
md C:\DriverCert\xg
xcopy c:\tools\drv1\ C:\DriverCert\xg /i /c /k /e /r /y
디렉토리로 이동:
cd “C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86”
INF 파일을 기반으로 CAT 파일(드라이버 패키지의 모든 파일에 대한 정보 포함)을 생성합니다. inf2cat.exe 도구(Windows 드라이버 키트, WDK)를 사용하면 플랫폼에 대한 CAT 파일을 생성할 수 있습니다.
inf2cat.exe /driver:"C:\DriverCert\xg20" /os:7_X64 /verbose
절차가 올바른지 확인하려면 C:\DriverCert\xg\xg20gr.cat 파일이 대상 디렉토리에 나타났고 로그에 메시지가 있습니다:
서명성 테스트 완료.
그리고
카탈로그 생성이 완료되었습니다.참고 . 제 경우에는 Inf2Cat.exe 명령이 오류를 반환했습니다.
서명 테스트 실패.오류:22.9.7:\hdx861a.inf에서 DriverVer가 잘못된 날짜로 설정되었습니다(최신 OS의 경우 2009년 4월 21일로 게시되어야 함).
오류를 수정하려면 [Version]
에서 DriverVer =가 있는 줄을 찾으십시오. 섹션을 다음으로 대체합니다.
드라이버 버전=05/01/2009,9.9.9.9
Missing AMD64 CatalogFile entry
오류가 발생하는 경우 (x64의 경우) 또는 Missing 32-bit CatalogFile entry
, 그런 다음 .inf 파일의 [Version] 섹션에 CatalogFile=xg20gr.cat 줄을 추가합니다.
자체 서명된 인증서로 드라이버 패키지 서명
다음 폴더로 이동:
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64"
Verisign을 타임스탬프 서비스로 사용하여 이전에 생성한 인증서로 드라이버 패키지(파일 세트)에 서명합니다. 다음 명령은 암호로 보호된 .pfx 파일에 저장된 인증서를 사용하여 디지털 서명으로 CAT 파일에 서명합니다.
signtool sign /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd /t https://timestamp.verisign.com/scripts/timstamp.dll /v C:\DriverCert\xg20\xg20gr.cat
최신 버전의 Windows 10 및 Windows 11에서 이 명령을 실행하면 오류가 발생합니다.
SignTool 오류:파일 다이제스트 알고리즘이 지정되지 않았습니다. /fd 플래그로 다이제스트 알고리즘을 지정하십시오. /fd SHA256을 사용하는 것이 권장되며 SHA1보다 안전합니다. /fd sha1을 사용하여 signtool을 호출하는 것은 이전 동작과 동일합니다. 서명 인증서의 서명에 사용되는 해시 알고리즘을 선택하려면 /fd certHash 옵션을 사용하십시오.
다른 명령을 사용해야 합니다.
signtool sign /tr https://timestamp.digicert.com /td SHA256 /v /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd "C:\DriverCert\xg\xg20gr.cat"
명령이 오류를 반환하는 경우
SignTool Error: An unexpected internal error has occurred
또는 Error information: SignerTimeStamp() failed. (-2147012865/0x80072eff)
, 다른 타임스탬프 서버 URL을 사용해 보세요. 목록 중 하나를 사용해 보십시오: https://timestamp.comodoca.com/authenticodehttps://timestamp.globalsign.com/scripts/timstamp.dllhttps://timestamp.verisign.com/scripts/timstamp.dllhttps://tsa.starfieldtech.comhttp //www.startssl.com/timestamp
CAT 파일이 성공적으로 서명되면 다음 메시지가 나타납니다.
성공적으로 서명됨:C:\DriverCert\xg\xg20gr.cat성공적으로 서명된 파일 수:1
드라이버의 디지털 서명은 .inf 파일에서 참조하는 .cat 파일에 포함되어 있습니다. 다음 명령을 사용하여 cat 파일에서 드라이버의 디지털 서명을 확인할 수 있습니다.
SignTool verify /v /pa c:\DriverCert\xg\xg20gr.cat
디지털 서명의 CAT 파일 속성에서 인증서에 대한 정보를 볼 수도 있습니다. 탭.
인증서를 신뢰할 수 없는 경우(또는 신뢰할 수 있는 루트 인증서 저장소에 추가되지 않은 경우) SignTool verify
를 실행할 때 오류가 나타납니다. 명령:
SignTool 오류:인증서 체인이 처리되었지만 신뢰 공급자가 신뢰하지 않는 루트 인증서에서 종료되었습니다.CAT 파일에는 드라이버 디렉토리에 있는 모든 파일(CopyFiles 부분). 이러한 파일 중 하나라도 변경된 경우 파일의 체크섬이 CAT 파일의 데이터와 일치하지 않으므로 이러한 드라이버 설치가 실패합니다.
Windows에 자체 서명된 드라이버 설치
다음 명령을 사용하여 서명한 드라이버를 다시 설치해 보십시오.
Pnputil –i –a C:\DriverCert\xg20\xg20gr.inf
이제 드라이버의 디지털 서명 누락에 대한 경고가 표시되지 않습니다.
Successfully installed the driver on a device on the system.
Driver package added successfully.
Windows 10 및 11에서 다음 경고가 나타납니다.
이 장치 소프트웨어를 설치하시겠습니까?
"설치"를 클릭합니다. Windows에 드라이버 패키지를 설치합니다.
어떤 이유로 드라이버가 설치되지 않은 경우 C:\Windows\inf\setupapi.dev.log 파일에 자세한 드라이버 설치 로그가 포함되어 있습니다. . 이 로그 파일을 사용하면 드라이버 설치 오류에 대한 자세한 정보를 얻을 수 있습니다. 대부분의 경우 "드라이버 패키지가 서명 확인에 실패했습니다 " 오류. 이것은 드라이버의 인증서가 신뢰할 수 있는 인증서 저장소에 추가되지 않았음을 의미합니다.
드라이버 설치에 성공하면 setupapi.dev.log
파일에는 다음 줄이 포함되어야 합니다.
>>>> [장치 설치(DiInstallDriver) - C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf]>>> 섹션 시작:2018/07/122:52 -i -ac:\DriverCert\xg\xg20gr.infndv:플래그:0x00000000ndv:INF 경로:C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf3f_amd64_c5955181214aa20gr. DriverStore \ FileRepository \ xg20gr.inf_amd64_c5955181217gr.inf} 13 :23 :37.046INF :복사 스타일 :0x00000000inf :드라이버 저장소 경로 :C :\ Windows \ System32 \ DriverStore \ FileRepository \ xg20gr.inf_amd64_c5955181214aazb \ xg20gr.infinf :게시 된 INF 경로 :C:\WINDOWS\INF\oem23.infinf:{SetupCopyOEMInf exit (0x00000000)} 13:23:37.077<<< Section end 2018/07/22 13:23:37.155<<< [ESS]Windows의 사용자 모드 및 커널 모드 드라이버
Windows에서 드라이버는 커널 모드 또는 사용자 모드에서 실행될 수 있음을 상기시켜 드리겠습니다. 이 방법으로 서명된 커널 모드 드라이버는 다음 오류와 함께 보안 부팅이 활성화된 UEFI 장치에서 Windows가 부팅될 때 로드되지 않습니다.
이벤트 ID:7000ERROR_DRIVER_BLOCKED1275 (0x4FB)이 드라이버는 로드가 차단되었습니다.
PowerShell 명령을 사용하여 보안 부팅 모드가 활성화되어 있는지 확인할 수 있습니다.
Confirm-SecureBootUEFI
SecureBoot가 활성화된 상태로 로드된 모든 커널 모드 드라이버는 Microsoft 인증 프로세스(WHQL – Windows Hardware Quality Lab)에서 서명해야 합니다. 그 이유는 커널이 로드될 때 UEFI가 Windows 로컬 컴퓨터 인증서 저장소의 인증서를 확인할 수 없기 때문입니다.
SignTool 오류:서명 인증서가 Microsoft 코드 확인 루트에 연결되지 않습니다.Microsoft는 Windows 10 1607부터 Windows 하드웨어 호환성 프로그램에 따라 필수 타사 드라이버 인증을 요구합니다.
자체 서명된 사용자 모드 드라이버(일반적으로 프린터, 스캐너, 플로터 등)는 SecureBoot가 활성화된 경우에도 작동합니다.
커널 모드 드라이버의 경우 디지털 서명 확인을 비활성화하고 테스트 모드에서 Windows를 부팅해야 합니다. bcdedit.exe 명령 사용:bcdedit.exe /set /nointegritychecks on
bcdedit.exe /set testsigning ON