ゲーム開発者向け Authenticode 署名
データ認証は、ゲーム開発者にとってますます重要になっています。 Windows Vista と Windows 7 には、保護者によるコントロールなど、データが改ざんされていないことを確認するためにゲームに適切に署名する必要がある機能が多数用意されています。 Microsoft Authenticode を使用すると、エンド ユーザーとオペレーティング システムは、プログラム コードが正当な所有者から取得され、悪意のある変更や誤って破損していないことを確認できます。 この記事では、ゲームの認証を開始する方法と、毎日のビルド プロセスに認証を統合する方法について説明します。
Note
2016 年 1 月 1 日以降、Windows 7 以降では、有効期限が 2016 年 1 月 1 日以降の SHA-1 コード署名証明書は信頼されなくなります。 詳細については、「 Windows の Authenticode コード署名とタイムスタンプの適用 を参照してください。
背景
デジタル証明書は、作成者の ID を確立するために使用されます。 デジタル証明書は、VeriSign や Thawte などの証明機関 (CA) と呼ばれる信頼されたサード パーティによって発行されます。 CA は、所有者が誤った識別を要求しないことを確認する責任があります。 証明書の CA に申請した後、商用開発者は 2 週間以内にアプリケーションへの応答を期待できます。
CA は、ポリシー条件を満たすと判断した後、国際電気通信連合によって作成された業界標準の証明書形式である X.509 に準拠するコード署名証明書を生成し、バージョン 3 の拡張機能を使用します。 この証明書は、ユーザーを識別し、公開キーを含みます。 これは参照用に CA によって格納され、コピーが電子的に提供されます。 同時に、秘密キーも作成します。秘密キーは安全に保つ必要があり、CA であっても誰とでも共有することはできません。
公開キーと秘密キーを用意したら、署名されたソフトウェアの配布を開始できます。 Microsoft には、Windows SDK でこれを行うツールが用意されています。 ツールは一方向ハッシュを利用し、固定長ダイジェストを生成し、秘密キーを使用して暗号化された署名を生成します。 次に、暗号化された署名を証明書と資格情報と組み合わせて署名ブロックと呼ばれる構造にし、実行可能ファイルのファイル形式に埋め込みます。 DLL、実行可能ファイル、キャビネット ファイルなど、任意の種類の実行可能バイナリ ファイルに署名できます。
署名は複数の方法で検証できます。 プログラムは CertVerifyCertificateChainPolicy 関数を呼び出すことができます。SignTool (signtool.exe) を使用して、コマンド ライン プロンプトから署名を検証できます。 Windows エクスプローラーには、署名されたバイナリ ファイルの各証明書を表示する [ファイルのプロパティ] の [デジタル署名] タブもあります。 ([デジタル署名] タブは、署名されたファイルの [ファイルのプロパティ] にのみ表示されます)。また、アプリケーションは、 CertVerifyCertificateChainPolicy を使用して自己検証できます。
Authenticode 署名は、エンド ユーザーによるデータ認証に役立つだけでなく、Windows Vista および Windows 7 の制限付きユーザー アカウントや保護者による制御による修正プログラムの適用にも必要です。 さらに、Windows オペレーティング システムの将来のテクノロジでは、コードの署名も必要になる可能性があるため、すべてのプロフェッショナルおよびアマチュア開発者が CA からコード署名証明書を取得することを強くお勧めします。 これを行う方法の詳細については、この記事の後半の「信頼された証明機関の使用を参照してください。
ゲーム コード、修正プログラム、およびインストーラーは、ファイルがコード内で本物であることを確認することで、Authenticode 署名をさらに活用できます。 これは、チート対策と一般的なネットワーク セキュリティに使用できます。 ファイルが署名されているかどうかを確認するコード例については、「 Example C Program: Verifying the Signature of a PE File」を参照してください。また、署名済みファイルの署名証明書の所有権を確認するコード例については、「 Authenticode 署名付き実行可能ファイルから情報を取得する方法」を参照してください。
作業の開始
作業を開始するために、Microsoft は Visual Studio 2005 と Visual Studio 2008、および Windows SDK で、コード署名プロセスの実行と検証に役立つツールを提供しています。 Visual Studio または Windows SDK をインストールした後、この技術記事で説明されているツールはインストールのサブディレクトリに配置されます。これには、次の 1 つ以上が含まれる場合があります。
- %SystemDrive%\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
- %SystemDrive%\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Bin
- %SystemDrive%\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\
- %SystemDrive%\Program Files\Microsoft SDKs\Windows\v6.0A\bin\
次のツールは、コードの署名に最も役立ちます。
-
証明書作成ツール (MakeCert.exe)
-
公開キーと秘密キーを含むテスト X.509 証明書を.cer ファイルとして .pvk ファイルとして生成します。 この証明書は内部テストのみを目的としており、パブリックに使用することはできません。
-
pvk2pfx.exe
-
.cerファイルと .pvk ファイルのペアから Personal Information Exchange (.pfx) ファイルを作成します。 .pfx ファイルには、公開キーと秘密キーの両方が含まれています。
-
SignTool (SignTool.exe)
-
.pfx ファイルを使用してファイルに署名します。 SignTool では、DLL ファイル、実行可能ファイル、Windows インストーラー (.msi) ファイル、およびキャビネット (.cab) ファイルの署名がサポートされています。
Note
他のドキュメントを読んでいる間に、SignCode (SignCode.exe) への参照が見つかる場合がありますが、このツールは非推奨であり、サポートされなくなりました。代わりに SignTool を使用してください。
信頼された証明機関の使用
信頼できる証明書を取得するには、VeriSign や Thawte などの証明機関 (CA) に適用する必要があります。 Microsoft は他の CA よりも CA を推奨しませんが、Windows エラー報告 (WER) サービスに統合する場合は、VeriSign を使用して証明書を発行することを検討する必要があります。WER データベースにアクセスするには、VeriSign ID を必要とする WinQual アカウントが必要であるためです。 信頼されたサード パーティの証明機関の完全な一覧については、「 Microsoft ルート証明書プログラムのメンバーを参照してください。 WER への登録の詳細については、ISV ゾーンの「introducing Windows エラー報告」を参照。
CA から証明書を受け取ったら、SignTool を使用してプログラムに署名し、プログラムを一般にリリースできます。 ただし、.pfx ファイルと .pvk ファイルに含まれている秘密キーを保護するように注意する必要があります。 これらのファイルは安全な場所に保管してください。
テスト証明書の使用例
次の手順では、テスト目的でコード署名証明書を作成した後、このテスト証明書を使用して Direct3D サンプル プログラム (BasicHLSL.exe と呼ばれます) の署名を行う方法を示します。 この手順では、公開証明書には使用できない.cerファイルと .pvk ファイル (それぞれ公開キーと秘密キー) を作成します。
この例では、タイムスタンプも署名に追加されます。 タイムスタンプを使用すると、証明書の有効期限が切れたときに署名が無効になるのを防ぐことができます。 署名されているがタイムスタンプがないコードは、証明書の有効期限が切れた後は検証されません。 そのため、公開されているすべてのコードにタイム スタンプが必要です。
証明書を作成してプログラムに署名するには
証明書作成ツール (MakeCert.exe) を使用して、テスト証明書と秘密キーを作成します。
次のコマンド ラインの例では、秘密キー (.pvk) ファイルのファイル名として MyPrivateKey、証明書 (.cer) ファイルのファイル名として MyPublicKey、証明書の名前として MySoftwareCompany を指定します。 また、信頼されていないルート証明機関を持たないように、証明書を自己署名します。
MakeCert /n CN=MySoftwareCompany /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e 12-31-2020 /sv MyPrivateKey.pvk MyPublicKey.cer
pvk2pfx.exeを使用して、秘密キー (.pvk) ファイルと証明書 (.cer) ファイルから個人情報交換 (.pfx) ファイルを作成します。
.pfx ファイルは、公開キーと秘密キーを 1 つのファイルに結合します。 次のコマンド ラインの例では、前の手順の .pvk ファイルと.cer ファイルを使用して、パスワード your_passwordを使用して MyPFX という名前の .pfx ファイルを作成します。
pvk2pfx.exe -pvk MyPrivateKey.pvk -spc MyPublicKey.cer -pfx MyPFX.pfx -po your_password
SignTool を使用して、Personal Information Exchange (.pfx) ファイルを使用してプログラムに署名します。
コマンド ラインでは、いくつかのオプションを指定できます。 次のコマンド ラインの例では、前の手順の .pfx ファイルを使用し、パスワードとしてyour_passwordを指定し、署名するファイルとして BasicHLSL を指定し、指定したサーバーからタイム スタンプを取得します。
signtool.exe sign /fd SHA256 /f MyPFX.pfx /p your_password /v /t URL_to_time_stamp_service BasicHLSL.exe
Note
タイム スタンプ サービスの URL は CA によって提供され、テストには省略可能です。 運用環境の署名に有効なタイム スタンプ機関を含めるか、証明書の有効期限が切れたときに署名の検証に失敗することが重要です。
SignTool を使用してプログラムが署名されていることを確認します。
次のコマンド ラインの例では、SignTool が詳細な出力を提供しながら、使用可能なすべてのメソッドを使用して、BasicHLSL.exeの署名の検証を試みる必要があることを指定します。
signtool.exe verify /a /v BasicHLSL.exe
この例では、証明書が CA によって発行されていないため、SignTool は証明書がアタッチされていることを示す一方で、信頼されていないことを示す必要があります。
テスト証明書を信頼します。
テスト証明書の場合は、証明書を信頼する必要があります。 CA によって提供される証明書は既定で信頼されるため、この手順はスキップする必要があります。
テスト証明書を信頼するコンピューターでのみ、次を実行します。
certmgr.msc
次に、信頼されたルート証明機関を右クリックし、[すべてのタスク] |輸入。 次に、作成した .pfx ファイルを参照し、ウィザードの手順に従って、信頼されたルート証明機関に証明書を配置します。
ウィザードが完了したら、そのコンピューターで信頼された証明書を使用してテストを開始できます。
コード署名を毎日のビルド システムに統合する
コード署名をプロジェクトに統合するには、コマンド ライン ツールを実行するバッチ ファイルまたはスクリプトを作成します。 プロジェクトがビルドされたら、適切な設定で SignTool を実行します (この例の手順 3 を参照)。
.pfx ファイルと .pvk ファイルへのアクセスが可能な限り少数のコンピューターとユーザーに制限されるように、ビルド プロセスでは特に注意してください。 ベスト プラクティスとして、開発者は出荷の準備ができるまでテスト証明書を使用してコードに署名する必要があります。 ここでも、秘密キー (.pvk) は、セキュリティで保護された場所 (安全な部屋やロックされた部屋など) に保管する必要があります。スマート カードなどの暗号化デバイスに保存するのが理想的です。
Microsoft Authenticode を使用して Windows インストーラー (MSI) パッケージ自体に署名することで、もう 1 つの保護レイヤーが提供されます。 これは、MSI パッケージを改ざんや偶発的な破損から保護するのに役立ちます。 Authenticode でパッケージに署名する方法の詳細については、MSI 作成ツールのドキュメントを参照してください。
無効化
秘密キーのセキュリティが侵害された場合、またはセキュリティ関連のイベントでコード署名証明書が無効な場合、開発者は証明書を取り消す必要があります。 これを行わないと、開発者の整合性と署名コードの有効性が低下します。 CA は、特定の時刻に失効を発行することもできます。失効時刻より前にタイム スタンプで署名されたコードは引き続き有効と見なされますが、後続のタイム スタンプを持つコードは無効になります。 証明書の失効は、失効した証明書で署名されたすべてのアプリケーションのコードに影響します。
コード署名ドライバー
ドライバーは Authenticode 署名が可能で、必要があります。 カーネル モード ドライバーには追加の要件があります。Windows Vista と Windows 7 の 64 ビット エディションでは、すべての署名されていないカーネル モード ドライバーのインストールが禁止され、すべてのバージョンの Windows では、ユーザーが署名されていないドライバーをインストールしようとしたときに警告プロンプトが表示されます。 さらに、管理者は、署名されていないドライバーが Microsoft Windows Server 2003、Windows XP Professional x64 Edition、および Windows Vista および Windows 7 の 32 ビット エディションにインストールされないようにグループ ポリシーを設定できます。
Windows Hardware Quality Labs (WHQL) または Unclassified Signature Program (旧称 Driver Reliability Signature) の一部として、Microsoft が信頼した署名を使用して署名できるドライバーの多くは、システムがこれらのドライバーを完全に信頼し、管理者の資格情報がなくてもインストールできます。
署名されていないドライバーまたは自己署名されたドライバー (つまり、テスト証明書で署名されている) は、多くの Windows ベースのプラットフォームにインストールできないので、少なくとも、ドライバーは Authenticode 署名されている必要があります。 ドライバーとコードの署名と関連機能の詳細については、「windows のドライバー署名要件Windows ハードウェア デベロッパー セントラルを参照してください。
まとめ
Microsoft Authenticode の使用は簡単なプロセスです。 CER を取得して秘密キーを作成したら、Microsoft が提供するツールを使用するのは簡単です。 その後、保護者によるコントロールなど、Windows Vista と Windows 7 の重要な機能を有効にし、製品が正当な所有者から直接提供されていることを顧客に知らせることができます。
詳細
署名コードに関連するツールとプロセスの詳細については、次のリンクを参照してください。