Windowsで未署名のデバイスドライバーに自己署名証明書で署名する方法【Windows 11/10/8.1/7対応】
デフォルト設定では、64ビット版のWindowsはすべて、有効なデジタル署名が付与されていないデバイスドライバーのインストールをブロックします。未署名のドライバーはOSによって拒否されます。デジタル署名は、そのドライバーが信頼できる開発者やベンダーによってリリースされたものであり、コードが改ざんされていないことを保証する仕組みです。
Windowsで未署名ドライバーの署名検証を無効化する方法はいくつかあります(GPOの利用、テストブートモードなど)。本記事では、Windows x64向けの任意の未署名ドライバーに署名する手順を解説します(Windows 11、10、8.1、7に適用可能)。
目次
- 自己署名ドライバー証明書の作成
- ドライバーパッケージ署名用のカタログファイル(CAT)の作成
- 自己署名証明書によるドライバーパッケージへの署名
- Windowsへの自己署名ドライバーのインストール
- Windowsにおけるユーザーモードドライバーとカーネルモードドライバー
ここでは、Windows 10 x64向けの未署名(デジタル署名なし)のデバイスドライバーがあると仮定します。例として、かなり古いグラフィックボード用のドライバーを使用します。ベンダーのWebサイトからWindows用のドライバーアーカイブをダウンロードし(Windows Vista x64用のビデオドライバーしか見つかりませんでした)、その内容を c:\tools\drv1\ に展開した状態から始めます。まず、組み込みツールの pnputil を使ってドライバーをWindowsドライバーストアに追加し、インストールを試みてみましょう。Pnputil –a c:\tools\drv1\xg20gr.inf
注意: このコマンドおよび以降のコマンドは、すべて管理者権限のコマンドプロンプトで実行する必要があります。
Windows 7では、ドライバーのインストール中に「OSがこのドライバーのデジタル署名を検証できない」という警告が表示されます。
Windows can't verify the publisher of this driver software.
一方、Windows 10(21H2)ではこの警告は表示されませんが、コンソールにエラーが出力されます。
Processing inf: xg20gr.inf
Adding the driver package failed: The third-party INF does not contain digital signature information.
また、エクスプローラーでINFファイルを右クリックして「インストール」を選択した場合も、以下のエラーが表示されます。
The third-party INF does not contain digital signature information.
そこで、このドライバーに自己署名証明書で署名してみましょう。
署名の生成とドライバーへの署名を行うには、以下のWindowsアプリケーション開発ツールをダウンロードしてインストールする必要があります。
- Windows SDK(Software Development Kit)またはお使いのWindowsバージョンに対応したMicrosoft Visual Studio 2005以降。
signtool.exeを含む Windows SDK Signing tools for Desktop パッケージをインストールしてください。 - Windows Driver Kit(WDK) — Microsoft公式サイトからダウンロードできます。
ヒント: これらのツールをインストールする前に、コンピューターに.NET Framework 4がインストールされていることを確認してください。
自己署名ドライバー証明書の作成
システムドライブのルートに C:\DriverCert フォルダーを作成します。
PowerShellの New-SelfSignedCertificate コマンドレットを使えば、コード署名証明書を作成できます。ここでは、有効期間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では、自己署名証明書の生成にWindows SDKに含まれる makecert.exe ツールを使用する必要があります。その場合、証明書作成のコマンドは以下のようになります。
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 とします。
先ほど作成した発行元証明書の公開鍵(SPC)を作成します。
cert2spc C:\DriverCert\myDrivers.cer C:\DriverCert\myDrivers.spc公開鍵(.spc)と秘密鍵(.pvk)を、Personal Information Exchange(.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 TRUSTEDPUBLISHERADドメイン環境では、グループポリシーを使ってこの証明書をクライアントコンピューターに一括展開することも可能です。
ローカルコンピューターの証明書管理スナップイン(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ファイル(ドライバーパッケージ内の全ファイルの情報を含む)を生成します。Windows Driver Kit(WDK)に含まれる inf2cat.exe ツールを使用すると、プラットフォーム用のCATファイルを生成できます。
inf2cat.exe /driver:"C:\DriverCert\xg20" /os:7_X64 /verbose処理が正しく行われたことを確認するには、対象ディレクトリに C:\DriverCert\xg\xg20gr.cat ファイルが生成されていること、およびログに以下のメッセージが表示されていることを確認します。
Signability test complete.
Catalog generation complete.
注意: 場合によっては、Inf2Cat.exeが以下のエラーを返すことがあります。
Signability test failed.
Errors:
22.9.7: DriverVer set to incorrect date (must be postdated to 4/21/2009 for newest OS) in \hdx861a.inf
このエラーを修正するには、INFファイルの [Version] セクション内の DriverVer = の行を探し、以下のように書き換えます。
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 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.
その場合は、次のコマンドを使用します。
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/authenticode
https://timestamp.globalsign.com/scripts/timstamp.dll
https://timestamp.verisign.com/scripts/timstamp.dll
https://tsa.starfieldtech.com
https://www.startssl.com/timestamp
CATファイルの署名が成功すると、以下のメッセージが表示されます。
Successfully signed: C:\DriverCert\xg\xg20gr.cat
Number of files successfully Signed: 1
ドライバーのデジタル署名は、INFファイルから参照される.catファイルに格納されます。以下のコマンドで、CATファイル内のドライバーのデジタル署名を確認できます。
SignTool verify /v /pa c:\DriverCert\xg\xg20gr.catCATファイルのプロパティにある「デジタル署名」タブでも、証明書の情報を確認できます。
証明書が信頼されていない場合(信頼されたルート証明書ストアに追加されていない場合)、SignTool verify コマンドの実行時に以下のエラーが表示されます。
SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
CATファイルには、ドライバーディレクトリ内の全ファイル(INFファイルの 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では、以下の警告が表示されます。
Would you like to install this device software?
「インストール」をクリックして、ドライバーパッケージをインストールします。
何らかの理由でドライバーがインストールされない場合は、詳細なインストールログが C:\Windows\inf\setupapi.dev.log ファイルに記録されています。このログファイルから、ドライバーインストールエラーの詳細情報を取得できます。多くの場合、「Driver package failed signature validation」というエラーが記録されています。これは、ドライバーの証明書が信頼された証明書ストアに追加されていないことを意味する可能性が高いです。
ドライバーのインストールが成功すると、setupapi.dev.log ファイルには以下のような行が記録されます。
>>> [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]
Windowsにおけるユーザーモードドライバーとカーネルモードドライバー
Windowsでは、ドライバーはカーネルモードまたはユーザーモードで実行されることを思い出してください。この方法で署名したカーネルモードドライバーは、Secure Bootが有効になっているUEFIデバイスでWindowsを起動した場合、以下のエラーにより読み込まれません。
Event ID: 7000
ERROR_DRIVER_BLOCKED
1275 (0x4FB)
This driver has been blocked from loading.
Secure Bootモードが有効かどうかは、以下のPowerShellコマンドで確認できます。Confirm-SecureBootUEFI
Secure Boot有効時に読み込まれるすべてのカーネルモードドライバーは、Microsoftの認証プロセス(WHQL — Windows Hardware Quality Lab)で署名されている必要があります。その理由は、カーネルの読み込み時、UEFIはWindowsのローカルコンピューター証明書ストア内の証明書を検証できないためです。
SignTool Error: Signing Cert does not chain to a Microsoft Code Verification Root.
Microsoftは、Windows 10 1607以降、Windowsハードウェア互換性プログラムにおいてサードパーティ製ドライバーの認証を必須としています。
一方、自己署名されたユーザーモードドライバー(通常はプリンター、スキャナー、プロッターなど)は、Secure Bootが有効でも動作します。
カーネルモードドライバーの場合は、デジタル署名の検証を無効にし、bcdedit.exeコマンドでWindowsをテストモードで起動する必要があります。bcdedit.exe /set /nointegritychecks on
bcdedit.exe /set testsigning ON
-
Windows 10でBluetoothを有効にする方法とオンにならないときの対処法
最近のパソコンの多くはBluetooth機能を標準搭載しており、ワイヤレススピーカーなどのBluetooth対応デバイスとの接続が可能です。しかし、「PCにBluetoothがあることは分かっているけれど、使い方がわからない」という方も少なくありません。この記事では、Windows 10のPCでBluetoothをオンにする方法をわかりやすく解説します。 記事を読み終える頃には、Windows 10でBluetoothを有効にする手順から、実際にデバイスと接続して使う方法までマスターできるはずです。それでは早速見ていきましょう。 Windows 10でBluetoothを有効にして使う手順
-
Windows 10でドライバーエラーコード32を修正する4つの効果的な方法
ドライバーエラーコード32は、特定のハードウェアのドライバーが何らかの理由で無効化された際に発生する、デバイスマネージャーでよく見られるエラーです。Windowsがあるデバイスのドライバーを検出できない場合、画面にエラーメッセージが表示されます。 パソコンの世界において、デバイスドライバーは非常に重要な役割を担っています。ドライバーはハードウェアとオペレーティングシステムをつなぐ仲介役として機能し、それぞれの動作を制御しています。そのため、ドライバーが応答しなくなった場合は、速やかに対処する必要があります。ドライバーの不具合の原因はさまざまで、古いドライバー、破損したドライバー、ドライバーが