1. ホーム

電子署名をいじる

2022-02-23 09:08:19

  昨日の会社のコードで、VCプロジェクトのPost Build Stepがsigntoolを使ってプロジェクトが生成するexeにデジタル署名を追加し、exeのコードの一部がWinVerifyTrustというWindows APIを呼び出してexe自身のデジタル署名を検証する、というのを見たんだ。ほんの数日、好奇心によって駆動少し無料は、にデジタル署名を叩いて開始されます。一日後にようやく少し得る、どのようにデジタル署名の一般的な理解だけでなく、より多くの理解の場所のそれらの2つの作品の会社のコードに、だから小さな要約を行う。

  まず、「アルゴリズム入門」の31.7「RSA公開鍵暗号システム」の最初のサブセクションを読むことをお勧めします。公開鍵暗号の枠組みを知るために、公開鍵暗号を読むのはもちろんのこと、Webで同様の入門記事を検索してみるのもよいでしょう。ここでは、数式を知る必要はなく、システム全体の論理の流れや設計思想、特に秘密鍵と公開鍵の概念を理解し、次のことを知ることです:メッセージは公開鍵と秘密鍵で2回符号化される、あるいはメッセージそのものを先に公開鍵と秘密鍵の両方で符号化されることがある。また、暗号化も電子署名も同じ公開鍵暗号方式をベースにすることができますが、前者は盗聴防止、後者は真正性の検証というように、その目的や作業の流れが異なることもここで理解することができました。

  次は、Windowsの電子署名ツールをいじって実践してみましょう。 サインツール は、Windows SDKに付属する、ファイルに電子署名を行うためのコマンドラインツールで、ファイル内の署名の検証や、ファイルのタイムスタンプにも利用することができます。同社のVCプロジェクトでは、以下のコマンドを使用してexeに電子署名を行いました。

<ブロッククオート

signtool /a <生成されたexe>

  しかし、私は自分のコンピュータでexeに署名するために同じコマンドを使用しましたが、常にエラー "SignTool Error.が発生します。与えられたすべての条件を満たす証明書は見つかりませんでした"。あなたがテストする場合、あなたは秘密鍵と公開鍵の両方のpfx形式を含む証明書ファイルを作成するmakecert、cert2spcとpvk2pfxを使用する必要があることを知って半日ポンド、その後exe署名にpfxファイル、または証明書ライブラリにpfxを使用し、サインツールが利用できる証明書を検索できるようにします。を参照することができます。 電子証明書を作成するためのmakecert 今回の記事 企業のプロジェクトをシミュレーションするために、証明書リポジトリのインポート、具体的にはこれを使いました。

  1. makecertで自分のルート証明書を作る。

E:\Temp>makecert -n "CN=ZzxiangRoot" -r -sky signature -sv ZzxiangRoot.pvk ZzxiangRoot.cer
成功

バイナリに明示的に署名を作成しようとしていたので、-sky signature オプションを追加する必要がありました。そのため、E: \Temp ディレクトリに、秘密鍵証明書 ZzxiangRoot.pvk と公開鍵証明書 ZzxiangRoot.cer という 2 つのファイルが生成されます。

2. cert2spc、すなわちspcファイルを使用して、公開鍵証明書をソフトウェアパブリッシャー証明書に変換します。

E:\Temp>cert2spc ZzxiangRoot.cer ZzxiangRoot.spc
成功

3. 3. pvk2pfx を使用して、公開鍵証明書と秘密鍵証明書を 1 つの PFX フォーマットの証明書ファイルに統合します。

E:\Temp>pvk2pfx -pvk ZzxiangRoot.pvk -spc ZzxiangRoot.spc -pfx ZzxiangRoot.pfx

4. 4. ZzxiangRoot.pfx をダブルクリックし、証明書リポジトリにインポートします。証明書インポートウィザード"で、"次へ"をクリックして、"証明書ストレージ"のステップまで進み、"次のストアにすべての証明書を配置する"を選択します。

参照」をクリックし、ポップアップしたダイアログボックスから「個人」を選択します。

なぜ "personal" を選択する必要があるのですか?signtoolのsignサブコマンドの/sオプションの説明を参照してください: "証明書を検索するときに開くストアを指定します。このオプションが指定されていない場合、Myストアが開かれます。"My"は、この場合、"personal"です。

あとは、インポートが完了するまで、ずっと"Next"まで進んでください。コンピュータの管理コンソールにアクセスして確認することができます。mmcインターフェースで、"File" -> "Add Delete Management Unit"を選択します。ポップアップ表示された「Add Delete Management Unit」ダイアログボックスで、左側の「Available Management Units」から「"Certificates"」を選択します。

中央の[追加]ボタンをクリックし、ポップアップダイアログボックスで[マイユーザーアカウント]または[コンピュータユーザーアカウント]を選択し、[完了]をクリックしてください。

これで、quot;certificate"ノードがquot;selected management node"に追加されました。

OK]をクリックし、管理コンソールのメインインターフェイスに戻り、左側のツリーコントロールの[Certificates - Current User]を展開し、[Select the "Certificates"] ノードを選択すると、ZzxiangRoot 証明書が表示されるようになります。

ZzxiangRoot をダブルクリックすると、証明書ダイアログボックスに "この証明書に対応する秘密鍵を持っています" と表示されます。また、このダイアログボックスには、「このCAルート証明書は信頼されていません。信頼できるようにするには、この証明書を「信頼されたルート証明機関」ストアにインストールしてください"。これについては後ほど説明します。

5. これで、signtoolコマンドを使用してexeに署名することができます。

E:\Temp>signtool sign /a Test.exe
追加ストアの追加完了
署名に成功しました。Test.exe

より詳細な出力を得るには、/v を追加します。

E:\Temp>signtool sign /a /v Test.exe
以下の証明書が選択されました。
    に発行されます。ZzxiangRoot
    発行元 ZzxiangRoot
    期限切れです。1月1日(日)07:59:59 2040
    SHA1ハッシュ。3361BBBD366687FD80B201F1346561C6E4936263
追加店舗の追加完了
署名に成功しました。Test.exe
Signedに成功したファイル数。1
警告の数 0
エラーの数 0

  次のステップは、exeの署名の検証です。このステップは、公開鍵暗号方式がそうであるように、どのマシン上でも行うことができます。会社のコードでは、WinVerifyTrust関数を使用しています。実際にはsigntoolツールも同様に進めて、コマンド形式は

<ブロッククオート

signtool verify /pa <exe> で、検証する必要があります。

  さもなければ、signtoolはWindowsドライバの署名検証ポリシーを使用することになるので、/paオプションが追加されなければならないことに注意してください。

  しかし、今、signtool verify /pa Test.exeを直接使用すると、エラー "SignTool Error.が発生します。A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider"エラーが発生しました。これは、認証に使用するコンピュータが、ZzxiangRootの公開鍵証明書を、先に述べた"信頼できるルート証明機関"に追加していないことが原因です。これを行うには、公開鍵証明書ZzxiangRoot.cerを認証マシンにコピーし、cerファイルをダブルクリックして表示される証明書ダイアログボックスで"Install Certificate"を選択する必要があります。次のステップは、前の証明書のインポート操作と同じですが、quot;Certificate Storage"のステップで、前のquot;Personal Storageではなく、quot;Trusted root certificate authority" storage areaに証明書を格納することを選択する必要がある点が異なっています。

  バリデーションが利用できるようになりました。

E:\Temp>signtool verify /pa Test.exe

検証に成功しました。テスト.exe

また、/vをつけるとより詳細な出力が得られます。

E:\Temp>signtool verify /pa /v Test.exe
検証中です。Test.exe
ファイルのハッシュ値(sha1): 8D3C56FBE8BB11FB760B729FF8F801DDBA7C3B59
署名の証明書チェーン。
    発行元 ZzxiangRoot
    発行元 ZzxiangRoot
    期限切れです。1月1日(日)07:59:59 2040
    SHA1ハッシュ。3361BBBD366687FD80B201F1346561C6E4936263
ファイルにタイムスタンプがありません。
検証に成功しました。Test.exe
検証に成功したファイル数 1
警告の数 0
エラーの数 0

  WinVerifyTrust関数を使った検証は MSDNに掲載されているこの例 . このルーチンはそのままコピーして使用することができますが、純粋なCファイルとしてではなく、C++ファイルとしてコンパイルすることに注意してください。

  はっきり言って、かなりおかしいです。私の大学は情報セキュリティを標榜していますが、大学を卒業して5年、情報セキュリティ関連の技術を本格的に勉強したのはこれが初めてです。