none
non pnp ドライバの署名について RRS feed

  • 質問

  • お世話になります。

    kmdfドライバの署名についてお伺いします。

    作成したupper filterドライバ(sys)は署名したのですが、infファイルの署名について教えてください。

    このドライバのインストールはexeにて、レジストリの追加、system32フォルダへのドライバファイルの配置、

    および下記のAPIにてインストールしています。

    WdfPreDeviceInstallEx
    CreateService
    WdfPostDeviceInstall

    infファイルはnon pnp サンプルをベースに作成しました。

    https://github.com/Microsoft/Windows-driver-samples/tree/master/general/ioctl/kmdf

    [Version]
    Signature="$WINDOWS NT$"
    [nonpnp.NT.Wdf]
    KmdfService = nonpnp, nonpnp_Service_kmdfInst
    [nonpnp_Service_kmdfInst]
    KmdfLibraryVersion = 1.11

    inf2cat でカタログファイルの作成に失敗します。

    このサンプルに追加で必要なセクションを教えていただけますでしょうか。

    また、このドライバをHCKサーバーでテストするにあたり、私が行っているようなAPIを使ったインストール方法ではなく

    infファイルからインストールするような記述方法に変える必要がありますか?

    ドライバはWindows7_X64,Windows8_X64,Windows8.1_X64,Windows10_X64環境でどれも同じもので動作することは

    確認できていますが、テスト環境はHCKサーバー、HLKサーバーのどちらかがあれば良いでしょうか?

    2016年9月14日 9:13

すべての返信

  • [Version]セクションには、CLASSネームとか、GUIDとか記述必要な気がします。
    あと、DriverVerとCatalogFile名が必要です。

    Signature="$WINDOWS NT$"
    Class=xxxxxxx
    ClassGuid={11223344-5566-7788-9900-xxxxxxx}
    Provider=name
    CatalogFile=xxxxx.cat
    DriverVer=01/01/2016, 1.00.00

    kmdfのようですので、co-installについても記述必要です。
    https://msdn.microsoft.com/ja-jp/windows/hardware/drivers/wdf/installing-the-framework-s-co-installer

    そもそも[Manufacturer]セクションが必要です。

    chkinfを使ってinfの構文チェックをすると良いです。
    https://blogs.msdn.microsoft.com/jpwdkblog/2011/10/07/inf-chkinf/

    windows10のテストにはHLK、それ以外のテストにはHCKが必要です。


    • 編集済み Iwasy 2016年9月15日 0:07
    2016年9月15日 0:06
  • ご教示ありがとうございます。

    chkinfでチェックが通り、inf2catでカタログファイルを作成し、コードサイニング署名を行いました。

    infファイルからインストールしたところ、DriverStoreにはコピーされたようですが、

    sysファイルはsystem32\drivers下にはコピーされませんでした。

    setupapi.dev.logを見ると、下記のようなエラーが見られました。

          sto:                {DRIVERSTORE IMPORT VALIDATE} 14:48:54.539
         sig:                     {_VERIFY_FILE_SIGNATURE} 14:48:54.555
         sig:                          Key      = MyApp.inf
         sig:                          FilePath = C:\WINDOWS\System32\DriverStore\Temp\{cc61df6e-e852-be4b-95c5-38ee41cd7fe7}\MyApp.inf
         sig:                          Catalog  = C:\WINDOWS\System32\DriverStore\Temp\{cc61df6e-e852-be4b-95c5-38ee41cd7fe7}\MyApp.cat
    !    sig:                          Verifying file against specific (valid) catalog failed! (0x800b0109)
    !    sig:                          Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
         sig:                     {_VERIFY_FILE_SIGNATURE exit(0x800b0109)} 14:48:54.586
         sig:                     {_VERIFY_FILE_SIGNATURE} 14:48:54.586
         sig:                          Key      = MyApp.inf
         sig:                          FilePath = C:\WINDOWS\System32\DriverStore\Temp\{cc61df6e-e852-be4b-95c5-38ee41cd7fe7}\MyApp.inf
         sig:                          Catalog  = C:\WINDOWS\System32\DriverStore\Temp\{cc61df6e-e852-be4b-95c5-38ee41cd7fe7}\MyApp.cat
         sig:                          Success: File is signed in Authenticode(tm) catalog.
         sig:                          Error 0xe0000241: The INF was signed with an Authenticode(tm) catalog from a trusted publisher.
         sig:                     {_VERIFY_FILE_SIGNATURE exit(0xe0000241)} 14:48:54.618

    署名に失敗しているのでしょうか?

    また、nonPNPのフィルタードライバーのため、ドライバのインストールはやはり冒頭で記述したAPIが必要だということでしょうか?

    infファイルからcat,inf,sysをDriverStoreにインストールしてから、当方のインストール用exe(API使用)でインストールし、デバイスマネージャ上で確認したところ、フィルタードライバーのデジタル署名はされていないと表示されていました。

    WdfPreDeviceInstallEx()、 CreateService()、 WdfPostDeviceInstall()を実行する前に、CryptCatAdmin*関数を

    用いてCatalogを追加する必要があるのでしょうか?

    参考URL:https://msdn.microsoft.com/windows/hardware/drivers/install/installing-a-test-signed-catalog-file-for-a-non-pnp-driver

    • 回答の候補に設定 Iwasy 2016年9月15日 23:42
    • 回答の候補の設定解除 Iwasy 2016年9月15日 23:42
    2016年9月15日 6:19
  • ドライバの署名にはクロス署名が必要です。
    クロス署名はされていますか?
    https://jp.globalsign.com/support/os/03.html

    2016年9月15日 23:50
  • クロス署名はしたつもりです。

    verifyしたときの表示内容です。

    >signtool verify /kp /v "MyApp.cat"

    Verifying: MyApp.cat
    Signature Index: 0 (Primary Signature)
    Hash of file (sha256): 60AA4A7585D7A288437524283D588FFADDD05846198C9E6005131005CAC85065

    Signing Certificate Chain:
        Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
        Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
        Expires:   Thu Jul 17 08:59:59 2036
        SHA1 hash: 4EB6D578499B1CCF5F581EAD56BE3D9B6744A5E5

            Issued to: Symantec Class 3 SHA256 Code Signing CA
            Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
            Expires:   Sun Dec 10 08:59:59 2023
            SHA1 hash: 007790F6561DAD89B0BCD85585762495E358F8A5

                Issued to: My Company Co.,Ltd.
                Issued by: Symantec Class 3 SHA256 Code Signing CA
                Expires:   Sat Nov 24 08:59:59 2018
                SHA1 hash: CB998633D345310868A27A57EEE75D00190E1846

    The signature is timestamped: Thu Sep 15 14:48:00 2016
    Timestamp Verified by:
        Issued to: Thawte Timestamping CA
        Issued by: Thawte Timestamping CA
        Expires:   Fri Jan 01 08:59:59 2021
        SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656

            Issued to: Symantec Time Stamping Services CA - G2
            Issued by: Thawte Timestamping CA
            Expires:   Thu Dec 31 08:59:59 2020
            SHA1 hash: 6C07453FFDDA08B83707C09B82FB3D15F35336B1

                Issued to: Symantec Time Stamping Services Signer - G4
                Issued by: Symantec Time Stamping Services CA - G2
                Expires:   Wed Dec 30 08:59:59 2020
                SHA1 hash: 65439929B67973EB192D6FF243E6767ADF0834E4

    Cross Certificate Chain:
        Issued to: Microsoft Code Verification Root
        Issued by: Microsoft Code Verification Root
        Expires:   Sat Nov 01 22:54:03 2025
        SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3

            Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
            Issued by: Microsoft Code Verification Root
            Expires:   Tue Feb 23 04:35:17 2021
            SHA1 hash: 57534CCC33914C41F70E2CBB2103A1DB18817D8B

                Issued to: Symantec Class 3 SHA256 Code Signing CA
                Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
                Expires:   Sun Dec 10 08:59:59 2023
                SHA1 hash: 007790F6561DAD89B0BCD85585762495E358F8A5

                    Issued to: My Company Co.,Ltd.
                    Issued by: Symantec Class 3 SHA256 Code Signing CA
                    Expires:   Sat Nov 24 08:59:59 2018
                    SHA1 hash: CB998633D345310868A27A57EEE75D00190E1846


    Successfully verified: MyApp.cat

    Number of files successfully Verified: 1
    Number of warnings: 0
    Number of errors: 0

    (固有名称は変更してあります)

    証明書は"MSCV-VSClass3.cer"を使用しました。

    https://knowledge.symantec.com/support/code-signing-support/index?page=content&actp=CROSSLINK&id=SO5820

    2016年9月16日 1:11
  • 信頼されたルート証明書がない、みたいなエラーが出てますね。

    私もほとんど同じようなnonPnPドライバで問題なく署名とインストールできているので、できると思います。

    信頼されたルート証明書機関に、Verisign のルート証明書は登録されているでしょうか?
    WindowsUpdateなどお試し下さい。

    あとはWindows10のAnniversaryUpdate以降は、カーネルドライバにはMS署名が必須になったようなので、そのあたりは該当するでしょうか?
    kmdfがそうなのかちょっとわからないのですが。

    2016年9月16日 9:17
  • Iwasyさんが回答されている通り、ルート証明書がインストールされていないように見えます。

    Verisignの場合は、下記サイトから入手できるので、試されては如何でしょうか。

      https://www.symantec.com/theme/roots

    また、インストールできない環境はXPではないですよね。

    使用されているKMDFはver.1.11で、サポート対象はVista以降となっています。

     https://msdn.microsoft.com/ja-jp/windows/hardware/drivers/wdf/kmdf-version-history

    また、以降はAnniversary Update版のWindows 10についてです。

    KMDFはカーネルモードで動作するので、下記サイトに記述されている署名条件の対象になります。

     https://msdn.microsoft.com/en-us/windows/hardware/drivers/install/kernel-mode-code-signing-policy--windows-vista-and-later-

    UEFIのSECURE BOOTオプションをOFF にすると、Microsoftの署名がなくても動作するはずです。

    原因を切り分けることができるかもしれません。


    • 編集済み Gothelauth 2016年9月17日 3:46 ハイパーリンクを設定
    2016年9月17日 3:43
  • ご回答ありがとうございます。教えて頂いたurlからルート証明書を取得し、明日試してみます。
    あと確認させてください。
    ドライバインストール時に、対象機にこのルート証明書を事前にインストールする必要があるのですか?それともCATを署名する時にこの証明書をインストールする必要があるのですか? 対応したいOSは、10/8.1/7の64bitです。インストール確認したOSは10(build1607)と8.1です。どちらも同じエラーがsetupapi.dev.logに記録されていました。ただ、表面上はエラーなく、ドライバ自体問題なく動作しています。仕様では10(build1607)ではEVコード署名が必須と読み取ったのですが、手持ちのコード署名(EVではない)で動作しているのが疑問です。また、Microsoftのダッシュボードにこのドライバを送信していないです。 もう一つ確認ですが、ダミーで作成したinfファイルからは直接デバイスにインストールされず、catファイルではなくinfファイルを指定するAPIによってインストールするこのフィルタドライバは、これはこれで問題ないのでしょうか? infからインストールしない場合はDriverStoreにも登録されません。 HLKのテスト対象としてこのドライバが出て来なかったので、Microsoftのダッシュボードにテスト結果を送信出来ませんが、フィルタドライバはそれ自体のテストを行う必要は無いのでしょうか? >UEFIのSECURE BOOTオプションをOFF にすると、Microsoftの署名がなくても動作するはずです。 確認します。

    2016年9月19日 10:12
  • ルート証明書ですが、対象機に事前インストールするのが安全です。

    catの署名環境では必須ではないと思いますが、私は署名後の証明書パスを確認するためにインストールしています。

    また、Windows8.1, 10で同じ様にエラーログが保存され、ドライバは動作しているのですね。

    蛇足と繰り返しになってしまいますが、下記項目を確認すると良いかもしれません。

     ・catファイル作成後や署名後に、infやドライバのバイナリが更新されていないか

      infやドライバのバイナリを更新すると、catファイルは再生成して署名しなおす必要があります。

     ・SECURE BOOT OFFでインストールに成功しないか

      Windows 8.1以降、メーカー出荷PCではSECURE BOOTがONになっているようです。

     ・DpInstを使用してドライバをインストールしても正しくインストールできないか


    以降はEV署名についてです。

    現在、Microsoftに下記の申請する場合、申請パッケージにEVコード証明書で署名する必要があります。

    (ドライバ自体への署名はSPC署名での良いはずですが、”申請するパッケージ”にはEVコード署名が必須です。)

     ・HCK テスト後に申請するとき

     ・HLKテスト後に申請するとき

     ・SPC署名の代わりにMicrosoftの署名を受けるとき

    ご注意ください。



    • 編集済み Gothelauth 2016年9月23日 11:54 誤解を招く表現になっていたのを修正
    2016年9月19日 12:44
  • 確認した内容です。

    > ・catファイル作成後や署名後に、infやドライバのバイナリが更新されていないか

    更新していません。

    > ・SECURE BOOT OFFでインストールに成功しないか

    確認していたPCがOFFでした。別のPCでSECURE BOOT ONであることを確認してインストールしたところ、署名されていないという表示は変わりませんが正常に動作しました。ただ、イベントログにhcmonの警告(Detected unrecognized USB driver)が記録されていました。

    > ・DpInstを使用してドライバをインストールしても正しくインストールできないか

    DpInstでインストールしても、署名されていないという表示は変わりませんでした。

    ただ、DpInstやinfファイル右クリックでインストールを行うと、UpperFiltersのレジストリ登録、カーネルサービスの登録はされますが、sysファイルがsystem32以下にコピーされないことがわかりました。

    マイクロソフトの署名を依頼、取得するため、HCK、HLKでテストを行う方向で進めたいと思います。

    2016年9月29日 4:47
  • > ただ、DpInstやinfファイル右クリックでインストールを行うと、
    > UpperFiltersのレジストリ登録、カーネルサービスの登録はされますが、
    > sysファイルがsystem32以下にコピーされないことがわかりました。

    ドライバ ファイルのコピー先は "%WinDir%\System32\Drivers" フォルダですが、ここにコピーされていなかった。。。ということでしょうか?
    だとしたら、inf ファイルの記述に問題がある可能性が高いと考えられますが、本当に chkinf ツールでのチェックでエラーは検出されなかったのでしょうか?
    ちなみに、どのデバイス クラスにアタッチさせているのでしょうか?
    (Non PnP の KMDF の Filter Driver って。。。該当しそうなデバイス クラスが思い浮かばないのです。)


    • 編集済み お馬鹿 2016年9月29日 6:33 追記
    2016年9月29日 6:28