Windowsのデバイスドライバは署名がないとインストールされないのはよく知られていると思います。
Windows XPや7の頃はカーネルモードの署名を施せばインストールすることができましたが、いつからかEV証明書というのが必要になり(証明書の値段が2倍近くになった)、2016年ごろのWindows 10 Anniversal UpdateからEV証明書でもダメになって、マイクロソフトに署名してもらうことが必須になりました。
2020年のこの記事や、2017年のこの記事でも書いたとおり、自分で作ったドライバをマイクロソフトの署名なしに動かすには、
① Windows10がAnniversary Update以前のものからアップデートされている
② PCでセキュアブートを無効にしている
③ 証明書が2015年7月29日以前に発行されている
④ ドライバがOS起動時にロードされる(一時的な措置であり、将来無効になるかも)
のどれかが必要でした。
なお、特電で販売しているSpartan-6ボードは2009年からあるし、Artix-7ボードも2011年ごろからあるので、上の③の条件を満たしているから動くのですが、新しいドライバが作れなくなってしまいます。なお、④の方法はうまくいきませんでした。私は③の方法で古い製品のVID、PIDを使い続けて、古いドライバを使うのがよいと思っているのですが・・
そのため、自作のデバイスドライバを動かすため「セキュアブートを無効にしてください」というようなお願いをしているハードウェアメーカーも少なからずあります。
そろそろマイクロソフトに認証してもらうことからは逃げられなくなってきたのですが、気になるポイントは2つあります。
● ドライバに厳しいテストをしなければいけないのか?
● 追加の費用が発生するのか?
このあたりが気になるところです。
そういうわけで、マイクロソフトに送って署名を施してもらう方法を調べてみました。
やり方はここやここに書いてあるのですが、ざっくり言うと、
- EVコードサイニング証明書を取得する(SSLのEV証明書とは別) ※追記
- 「マイクロソフトのハードウェアパートナープログラム」に登録する。
- 署名を施したものをCABでアーカイブする
- ハードウェアパートナープログラムのWebから送信する
というもので、意外とあっけないものでした。
手順通りにやったら、本当にあっけなく、ドライバがインストールされて動作しました。

今までの心配はなんだったんだろう。。
それでは手順を説明します。まずEVコードサイニング証明書をGMOグローバルサインとかで購入してください。 ※追記
それから、Azure Active Directoryへの登録を行います。Azure Active Directoryというのはユーザ名@会社名.onmicrosoft.comのメールアドレスが発行されるアレです。

この登録フォームで会社名を入れていくと、唐突に「コード署名証明書」を要求されます。

このページからbinファイルをダウンロードして、signtoolを使って署名を施します。

署名を施したbinファイルをサイトにアップロードすると先に進めるようになります。

EV証明書を持っていないと先に進めません。厳しいですが、EV証明書は会社が存在していれば簡単に取得できるので、そんなに難しい話ではありません。ツイッタランドにのみ存在する架空の会社ではドライバが作れないのでご注意ください。
登録が済むと、Microsoftパートナーセンタのハードウェアダッシュボードが開きます。
いろいろな試行錯誤をした後なのでごちゃごちゃとあります(不要なプロジェクトが消せない)。

Submit New Hardwareをクリックします。

ハードウェアの名前を入力して、灰色の部分にINFとSYSとCATを固めたCABファイルをドラッグアンドドロップします。
簡単に説明すると、デバイスドライバの本体はSYSファイルで、それをインストールするためのファイルがINFファイルです。INFを書いたらinf2catでCATファイルに変換して、signtoolでCATとSYSに署名をします。コインストーラのDLLとかがある場合は一緒に固めます。ここまでは従来のデバイスドライバの開発と同じです。
異なる点は、INF,CAT,SYSをどこかのディレクトリに入れて、DDFファイルを書いてCABを作ることです。
;**_ Echo.ddf example
;
.OPTION EXPLICIT ; Generate errors
.Set CabinetFileCountThreshold=0
.Set FolderFileCountThreshold=0
.Set FolderSizeThreshold=0
.Set MaxCabinetSize=0
.Set MaxDiskFileCount=0
.Set MaxDiskSize=0
.Set CompressionType=MSZIP
.Set Cabinet=on
.Set Compress=on
;Specify file name for new cab file
.Set CabinetNameTemplate=tkdnsp6x64.cab
; Specify the subdirectory for the files.
; Your cab file should not have files at the root level,
; and each driver package must be in a separate subfolder.
.Set DestinationDir=win10x64
;Specify files to be included in cab file
D:\naitou\np1116\np1116fw\win10driver\win10x64\tkdnsp6x64.cat
D:\naitou\np1116\np1116fw\win10driver\win10x64\tkdnsp6x64.sys
D:\naitou\np1116\np1116fw\win10driver\win10x64\tkdnsp6x64.inf
こういうファイルを作っておいて、
makecab /f tkdnsp6x64.ddf
とすれば、指定されたファイルがCABに固められます。普段はCABで圧縮することなんてないので、こんなファイルを作る機会はめったにないと思います。署名してディレクトリ作ってコピーしてCABで固めるという作業は何度も試行錯誤すると思うのでバッチファイルを作ったほうがいいでしょう。
その次に、どんなハードウェアをサポートするかというチェックボックスがあるので、x64と書いたものを全部チェックしておきます。

これでSubmitを押せば提出完了です。
マイクロソフトのサーバの中で検証が行われ、画面が自動的に更新されていきます。
最初のPreparationでINFファイルのエラーが徹底的に検証されます。おそらく、最初は何度もエラーが出て拒否されるのではないかと思います。

そのたびにINFを直して再度CABを作ってEV署名して、新たなプロジェクトを申請して、という試行錯誤を繰り返します。
エラーがなければ、Scanning、Validation、Catalog creation、Sign、Finalizeのすべてのプロセスが15分くらいで完了します。
そうしたら名前の右にあるMoreをクリックして、下の図にあるDownload signed filesを出し、これを押します。

これで、マイクロソフトに署名されたドライバがダウンロードできるというわけです。

このドライバをインストールすれば最新のWindows 10で、セキュアブートを有効にしたまま動かすことができます。
めでたしめでたし。
ちょっと、署名の中身を見比べてみましょう。
ドライバのCATファイルのプロパティから、デジタル署名のタブを開いてみます。
自分でEV署名を行った状態では、署名者名が自分になっています。

マイクロソフトに提出したものをダウンロードしたドライバでは、署名者名がMicrosoft Windows Hardware Compatibility Publisherに変わっています。おおー

また、拡張キー使用方法というところが「コード署名 (1.3.6.1.5.5.7.3.3)」だけだったのが、

「Windows ハードウェア ドライバーの確認 (1.3.6.1.4.1.311.10.3.5) Windows ハードウェア ドライバーの構成証明付き検証 (1.3.6.1.4.1.311.10.3.5.1) コード署名 (1.3.6.1.5.5.7.3.3)」に増えています。

なんだかよくわからんが、強そうだ。
あと、署名が完了したら、パートナーセンターのNew Shipping Labelというところを押せば、Windows Updateを通じて配布できるようになるらしいです。つまり、「USBでつないだら自動的にWindows Updateからドライバがダウンロードされてインストール」ができるようになるのですが、どのようなテストをしたかとか、協力しているマイクロソフトスポンサーのメールアドレスとか書かなければならないようなので、ちょっとハードルが高いですね。
自分のサイトでのみ配布することにしておけば、ここまでで十分です。
そういえば、ドライバに厳しいテストをする場面やテストレポートの提出はありませんでした。また、費用も発生しませんでした。
想像していたような怖いものではなかったので、デバイスドライバを開発した人はぜひチャレンジしてみてください。
最近のコメント