ゲーム開発者のための Authenticode 署名
XNA デベロッパー コネクション (XDC)
2006 年 12 月
はじめに
ゲーム開発者にとって、データ認証はますます重要となっています。Windows Vista では、保護者による制限を始めとする多数の機能で、データが改ざんされていないことを保証する適切な署名が行われていることがゲームに求められます。Microsoft Authenticode は、プログラム コードが正当な所有者から取得したものであること、およびコードが不当に変更されたり誤って破壊されたりしていないことを、エンド ユーザーとオペレーティング システムが検証できるようにする機能です。この記事では、ゲームを認証する方法、および日常のビルド プロセスに認証を組み入れる方法について説明します。
背景
作成者の身元を立証するには、デジタル証明書が使用されます。デジタル証明書は、証明機関 (CA) と呼ばれる信頼されたサードパーティ (VeriSign や Thawte) が発行します。CA には、所有者が身元を偽っていないことを確認する責任があります。CA に証明書を申請した開発元には、2 週間以内に申請に対する回答が送られます。
CA は、申請者が CA のポリシー基準を満たしていると判断すると、国際電気通信連合が策定した業界標準の証明書形式である X.509 (Version 3 の拡張付き) に準拠したコード署名証明書 (CER) を生成します。この証明書は、申請者を識別するものであり、公開キーを含んでいます。証明書は CA が参照用に保管し、申請者にはコピーが電子送付されます。申請者は、これと同時に秘密キーを作成します。このキーは安全に保管する必要があり、CA を含めた第三者に公開してはなりません。
公開キーと秘密キーが揃ったら、署名されたソフトウェアを配布できるようになります。Microsoft では、これを行うためのツールを Platform SDK で提供しています。ツールでは、一方向ハッシュを利用し、固定長のダイジェストを作成し、秘密キーで暗号化された署名を生成します。さらに、暗号化した署名を証明書および資格情報と組み合わせて署名ブロックと呼ばれる構造を作成し、実行可能ファイルのファイル形式に埋め込みます。DLL、実行可能ファイル、キャビネット ファイルを始めとする、あらゆる種類の実行可能バイナリ ファイルに署名できます。
署名は複数の方法で検証できます。プログラムで CertVerifyCertificateChainPolicy 関数を呼び出すことも、コマンド ライン プロンプトから SignTool (signtool.exe) を使用して署名を検証することもできます。また、Windows エクスプローラーでは、[ファイルのプロパティ](File Properties) の [デジタル署名](Digital Signatures) タブに、署名されたバイナリ ファイルの各証明書が表示されます([デジタル署名](Digital Signatures) タブは、署名されたファイルの [ファイルのプロパティ](File Properties) にのみ表示されます)。アプリケーションで CertVerifyCertificateChainPolicy API を使用して自己検証することもできます。
Authenticode 署名は、エンド ユーザーによるデータ認証に役立つだけでなく、限定的なユーザー アカウント修正および Windows Vista の保護者による制限でも必要とされます。Windows に今後導入されるテクノロジにも署名されたコードが必要になる可能性があるため、プロフェッショナルもアマチュアも含めたすべての開発者に、CA から CER を取得することを強くお勧めします。取得方法の詳細については、この記事の「信頼された証明機関の使用」を参照してください。
ゲームのコード、パッチャー、およびインストーラーは、Authenicode 署名をさらに活用して、ファイルが正規のものであることをコード内で検証できます。これは、不正行為対策および一般的なネットワーク セキュリティに使用することができます。ファイルが署名されているかどうかをチェックするコード例が、「Example C Program:Verifying the Signature of a PE File (C プログラムの例 : PE ファイルの署名の検証)」に掲載されています。また、署名されたファイルの署名証明書の所有者をチェックするコード例が、「How To Get Information from Authenticode Signed Executables (Authenticode で署名された実行可能ファイルから情報を取得する方法)」に掲載されています。
基本的な情報
Microsoft では、コード署名プロセスの実行と検証を支援するツールを、Visual Studio 2005 および Platform SDK で提供しています。Visual Studio 2005 または Platform SDK をインストールすると、これらのツールが以下のサブディレクトリのどちらかにそれぞれ配置されます。
- %SystemDrive%\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
- %SystemDrive%\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Bin
コードの署名に最も役立つツールは次のとおりです。
- 証明書作成ツール (MakeCert.exe)
公開キーを含んだテスト用の X.509 証明書 (CER) および秘密キーを含んだ .pvk ファイルを生成します。この証明書は、内部テストにのみ使用され、公的には使用できません。 - pvk2pfx.exe
CER および PVK ファイルから、Personal Information Exchange (PFX) ファイルを作成します。PFX には、公開キーと秘密キーの両方が含まれています。 - SignTool (SignTool.exe)
PFX ファイルを使用してファイルに署名します。SignTool は、DLL、EXE、MSI、CAB の各ファイルへの署名をサポートします。
注 SignCode (SignCode.exe) について言及しているドキュメントもありますが、このツールは非推奨となり、サポートされなくなったため、代わりに SignTool を使用してください。
信頼された証明機関の使用
信頼された証明書を取得するには、VeriSign や Thawte などの証明機関 (CA) に申請する必要があります。Microsoft は特定の CA を推奨していませんが、Windows エラー報告 (WER) サービスとの統合を考えている場合は、VeriSign による証明書の発行を検討してください。これは、WER データベースへのアクセスに必要な WinQual アカウントに VeriSign ID が必要であるためです。信頼されたサードパーティの証明機関の一覧については、「Microsoft Root Certificate Program Members (Microsoft ルート証明書プログラムのメンバー)」を参照してください。WER への登録の詳細については、「ISV Zone (ISV ゾーン)」の「Introducing Windows Error Reporting (Windows エラー報告の概要)」を参照してください。
CA から証明書を受け取ったら、SignTool を使用してプログラムに署名し、プログラムを公的にリリースすることができます。ただし、PFX ファイルと PVK ファイルに含まれている秘密キーの保護には注意する必要があります。これらのファイルは必ず安全な場所に保管してください。
テスト証明書の使用例
ここでは、テスト用のコード署名証明書を作成し、このテスト証明書を使用して Direct3D サンプル プログラム (BasicHLSL.exe) に署名する手順を示します。この手順で作成する CER と PVK (つまり公開キーと秘密キー) を公的な証明に使用することはできません。
この例では、署名にタイム スタンプも追加されます。タイム スタンプがあると、証明書の期限が切れたときに署名が無効になるのを防止できます。署名されていてもタイム スタンプがないコードは、証明書の期限が切れると検証できなくなります。このため、公的にリリースされるすべてのコードにタイム スタンプが必要です。
証明書を作成してプログラムに署名するには
証明書作成ツール (MakeCert.exe) を使用して、テスト用の CER と PVK を作成します。
次に示すコマンド ラインの例では、MyPrivateKey を PVK のファイル名、MyPublicKey を CER のファイル名、MySoftwareCompany を証明書の名前としてそれぞれ指定します。また、信頼されていないルート機関を持たないように、この証明書を自己署名形式にします。
makecert.exe -r -sv MyPrivateKey.pvk -n "CN=MySoftwareCompany" MyPublicKey.cer
pvk2pfx.exe を使用して、PVK と CER から PFX を作成します。
PFX ファイルによって、公開キーと秘密キーが 1 つのファイルに結合されます。次に示すコマンド ラインの例では、前の手順の PVK と CER を使用して、MyPFX という PFX を作成し、パスワード your_password を指定します。
pvk2pfx.exe -pvk MyPrivateKey.pvk -spc MyPublicKey.cer -pfx MyPFX.pfx -po your_password
SignTool を使用してプログラムに PFX で署名します。
コマンド ラインにはいくつかのオプションを指定できます。次に示すコマンド ラインの例では、前の手順の PFX ファイルを使用して、your_password をパスワードとして指定し、BasicHLSL を署名対象のファイルとして指定し、指定のサーバーからタイム スタンプを取得します。
signtool.exe sign /f MyPFX.pfx /p your_password /v BasicHLSL.exe /t URL_to_time_stamp_service
注 タイム スタンプ サービスへの URL は CA から提供されますが、指定は任意です。
SignTool を使用してプログラムが署名されていることを確認します。
次に示すコマンド ラインの例では、SignTool に対し、使用可能な方法をすべて使用して BasicHLSL.exe の署名を検証する一方で、詳細を出力するように指定します。
signtool.exe verify /a /v BasicHLSL.exe
この例では、証明書が添付されていること、およびその証明書が CA から発行されていないために信頼されていないことが SignTool から通知されます。
テスト証明書を信頼するように処理します。
テスト証明書の場合は、証明書を信頼するように処理する必要があります。CA から提供される証明書は既定で信頼されるため、このような証明書の場合はこの手順を飛ばします。
テスト証明書を信頼するように処理するコンピューターだけで、次のコマンドを実行します。
certmgr.msc
[信頼されたルート証明機関](Trusted Root Certification Authorities) を右クリックし、[すべてのタスク](All Tasks)、[インポート](Import) の順にクリックします。作成した .pfx ファイルを参照し、ウィザードの手順に従って、証明書を [信頼されたルート証明機関](Trusted Root Certification Authorities) に配置します。
ウィザードが完了したら、そのコンピューター上で信頼された証明書を使ってテストすることができます。
日常のビルド システムへのコード署名の統合
プロジェクトにコード署名を統合するには、コマンド ライン ツールを実行するバッチ ファイルまたはスクリプトを作成します。プロジェクトを構築したら、適切な設定で SignTool を実行します (前述の例の手順 3 を参照)。
ビルド プロセスでは、PFX ファイルと PVK ファイルにアクセスするコンピューターとユーザーをできるだけ少なく抑えるように特に注意してください。開発者には、出荷できる状態になるまでテスト証明書でコードに署名することをお勧めします。この場合も、秘密キーは金庫や施錠された部屋などの安全な場所に保管する必要があります。スマート カードなどの暗号化デバイスで保管するのが理想的です。
さらに保護を強化するために、Microsoft Authenticode を使用して Windows インストーラー (MSI) パッケージ自体に署名することもできます。これにより、MSI パッケージが改ざんや過失による破壊から保護されます。Authenticode を使用してパッケージに署名する方法の詳細については、MSI 作成ツールのドキュメントを参照してください。
失効
秘密キーのセキュリティが損なわれた場合や、セキュリティに関連する何らかのイベントによってコード署名証明書が無効になった場合、開発者は証明書を失効させる必要があります。これを行わないと、開発者の信頼性が低下し、コードに署名する効果が弱まります。CA が特定のタイミングで失効を実施することもできます。失効時間前のタイム スタンプで署名されたコードはその後も有効と見なされますが、失効時間後のタイム スタンプがあるコードは無効になります。証明書の失効は、その証明書で署名されているすべてのアプリケーションのコードに影響します。
コード署名ドライバー
ドライバーは、Authenticode で署名でき、またその署名が必要です。カーネルモード ドライバーには、追加の要件があります。64 ビット版の Windows Vista では、署名されていないカーネルモード ドライバーをインストールできません。また、Windows の全バージョンで、署名されていないドライバーをインストールしようとすると警告プロンプトが表示されます。さらに管理者は、署名されていないドライバーが Microsoft Windows Server 2003、Windows XP Professional x64 Edition、および 32 ビット版 Windows Vista にインストールされないようにするグループ ポリシーを設定できます。
Microsoft によって信頼された署名で多数の種類のドライバーに署名することができます。これは、Windows Hardware Quality Labs (WHQL) のロゴ プログラムの一環として、またはシステムがこれらのドライバーを完全に信頼して管理者の資格情報がなくてもインストールできるようにする Unclassified 署名プログラム (以前の名称は Driver Reliability Signature (ドライバー信頼性署名プログラム)) の一環として行われます。
ドライバーには、Authenticode による署名が最低限必要です。これは、Windows ベースのプラットフォームの多くで、署名されていないドライバーや自己署名されたドライバー (つまりテスト証明書で署名されたドライバー) をインストールできないようになっているためです。Windows Vista でのドライバーとコードの署名、および関連機能の詳細については、Windows Hardware Developer Central で「Windows のドライバー署名の要件」を参照してください。
まとめ
Microsoft Authenticode を使用する手順は簡単です。CER を取得して秘密キーを作成したら、後は Microsoft が提供するツールを使用するだけです。これで、保護者による制限を始めとする Windows Vista の重要な機能を使用できるようになります。また、自分の開発した製品が正当な所有者から直接提供されていることを顧客に通知することができます。
その他の情報
コードの署名に関連するツールとプロセスの詳細については、次のリンクを参照してください。
Crypto API Tools Reference (Crypto API ツール リファレンス)
Authenticode Overview and Turtorials (Authenticode の概要とチュートリアル)
Digital Certificates (デジタル証明書)