技術(tech)

【Macユーザ】仮想Windows環境でアプリのコードサイニング署名を実行

はじめに

  • この記事の目的: Mac上に仮想Windows環境を構築し、USBトークンを使ったコード署名を実行する方法を解説
  • 前提条件: グローバルサインの証明書がUSBトークンにインストール済みであること
  • 技術スタック: macOS、UTM (仮想化ソフト)、Windows 11Windows SDKGlobalSign証明書

前回の記事「IE非対応でもグローバルサインのサイニング証明書をダウンロードしたい」では、Macユーザーがグローバルサインの証明書をUSBトークンにダウンロードする方法と、IE経由の方法を誤って選択した場合の対処法を解説しました。

今回は、証明書をUSBトークンに正常にインストールできたMacユーザーが、実際にアプリケーションに署名する方法を解説します。Windows専用の署名ツールを使用するため、Mac上に仮想Windows環境を構築する手順から説明します。

USBトークンが必須となった背景

「なぜPFXファイルではなくUSBトークンを使わなければならないのか?」という疑問をお持ちの方も多いでしょう。実は、これには重要なセキュリティ上の理由があります。

2023年の重要な仕様変更

2023年4月24日より、セキュリティ強化の一環として、コードサイニング証明書はUSBトークンへの格納が必須となりました。これはグローバルサインだけでなく、すべての認証局に適用される共通の仕様変更です。

PFXファイルが使えなくなった理由

従来は、証明書をPFX形式でエクスポートし、複数のマシンで使用することが可能でした。しかし、この方法ではセキュリティリスクが高まります:

  1. 秘密鍵の漏洩リスク: PFXファイルには秘密鍵が含まれており、ファイルが流出すると証明書の不正利用が可能になる
  2. マルウェア署名の防止: 証明書が不正に取得された場合、悪意のあるソフトウェアに署名される危険性がある
  3. 物理的なセキュリティ確保: USBトークンは物理的に所持しなければ使用できないため、リモート攻撃からの保護が強化される

グローバルサインからの公式回答

以下は、PFXファイルへのエクスポートに関するグローバルサインからの回答の一部です:

誠に恐れ入りますが、コードサイニング証明書につきましては
2023年4月24日の仕様変更により、USBトークンへの格納が必須となりました。

そのため、USBトークン格納タイプで発行した証明書はPFX形式で抜き出すこと
(エクスポートやコピー利用)ができない仕様でございます。

なお、上記仕様は弊社のみではなく認証局全体で共通のため、大変お手数ですが、
まずはサービス提供元様へ対応や署名可否(USBトークンに格納した証明書を利用できるのか等)を
ご確認いただけますと幸いでございます。

対象読者

  • USBトークンにグローバルサイン証明書をインストール済みのMacユーザー
  • Windowsマシンを持っていないが、コード署名が必要なMac開発者
  • macOS上で仮想環境を使用してWindowsツールを実行したい方

仮想化環境の選択

MacでWindowsを実行するには複数の選択肢があります:

  1. UTM (今回使用):

    • 無料・オープンソース
    • Apple Silicon対応
    • USB対応 (重要: USBトークンを認識可能)
    • 比較的簡単な設定
  2. Parallels Desktop:

    • 有料ソフト
    • 高性能だが、ライセンス費用が必要
  3. VMware Fusion:

    • 有料ソフト
    • 安定性が高いが、設定が複雑

今回は無料で使えるUTMを使用して解説します。ただし、どの仮想化ソフトでも基本的な手順は同じです。

1. Windows環境の準備

Windows ISOのダウンロード

Apple SiliconのMacを使用している場合と、Intel Macを使用している場合でダウンロードするISOが異なります:

Apple Silicon (M4でも動きました) Mac用:

  1. Windows 11 ARM版のダウンロードページにアクセス
  2. 「今すぐダウンロード」をクリック
  3. ISOファイル (約4-5GB) をダウンロード

Intel Mac用:

  1. Windows 11標準版のダウンロードページにアクセス
  2. 「今すぐダウンロード」をクリック
  3. ISOファイル (約4-5GB) をダウンロード

注意点

  • Windows 11のインストールにはMicrosoftアカウントが必要になる場合があります
  • プロダクトキーは不要でも評価版としてインストール可能です
  • ダウンロードには安定したインターネット接続が必要です

2. UTMのインストール

UTMは無料の仮想化ソフトウェアで、Apple Siliconを含む様々なMacで動作します。

  1. UTM公式サイトにアクセス
  2. 「Download」ボタンをクリック
  3. ダウンロードしたDMGファイルを開き、UTMをアプリケーションフォルダにドラッグ

3. Windows仮想マシンの作成

基本設定

  1. UTMを起動し、"新規仮想マシンを作成"
  1. 「仮想化」→「Windows」を選択
  1. 以下の推奨設定を行います:

    • メモリ: 6GB以上(4GBだとWindowsが起動しないことがあります)
    • CPUコア: 2コア以上(4コア推奨)
    • ストレージ: 64GB以上
    • ディスプレイ解像度: フルHD (1920×1080) 推奨
  2. 「ISOイメージ」欄で、ダウンロードしたWindows ISOファイルを選択

4. Windowsのインストールと初期設定

  1. 作成した仮想マシンを起動

  2. BIOS画面が表示された場合は、Windows ISOファイルをマウントしているデバイスを選択して、Windowsを起動します

  3. Windows 11のインストーラが起動するので、画面の指示に従って進めます:

    • 言語設定: 日本語
    • エディション: Windows 11 Pro推奨(署名ツールの互換性向上)
    • プロダクトキー: 「プロダクトキーがありません」を選択可能
  • インストールタイプ: 「カスタム」
    • パーティション: 未割り当て領域を選択
  1. インストールが完了したら、初期設定を進めます:
    • Microsoftアカウント: 新規作成または既存のものを使用
    • プライバシー設定: 必要に応じて調整

USBパススルーの設定

Mac側にUSBを差し込むと、仮想マシン側で接続を許可するかどうか問われるので、Yesと回答しましょう。

UTM Guest Toolsのインストール

パフォーマンス向上のために重要なステップです:

  1. Windows起動後、UTMのメニューから「仮想マシン」→「SPICE/QEMUツールのインストール」を選択
  2. Windowsで自動的にインストーラが起動するので、指示に従ってインストール
  3. 完了後、仮想マシンを再起動

5. Windows SDKのインストール

コード署名に必要なSigntoolを入手するためのステップです:

  1. Windows内でMicrosoft Edgeを起動
  2. Windows SDK ダウンロードページにアクセス
  3. 「Windows SDKのダウンロード」ボタンをクリック
  1. ダウンロードしたインストーラ(winsdksetup.exe)を実行
  2. インストールオプション画面で以下を選択:
    • 「Windows SDKのSigningツール」にチェック
    • その他のコンポーネントは不要であればチェックを外す
  3. 「インストール」をクリックして完了するまで待つ

6. USBトークンの接続とドライバインストール

  1. USBトークンをMacのUSBポートに接続
  2. UTM画面上部の「USB」アイコンをクリックし、接続されたUSBトークン(例: "SafeNet eToken")を選択
  3. Windows内でトークンが認識されるとドライバインストールが開始される場合があります
  4. マシンによっては手動でドライバをインストールする必要があるかもしれません:
    • グローバルサインのメールに記載されたWindows用Safenet Clientをダウンロード
    • インストーラを実行し、指示に従って完了

7. コード署名の実行

テスト用実行ファイルの準備

  1. 署名したい実際の.exeファイルを用意
    • 注意: テキストファイルの拡張子を変更しただけのファイルではなく、実際の実行ファイルが必要
  2. 適当なメモ帳等のExeファイルをコピーして、テスト用に利用することも可能です

署名ツールの実行

  1. スタートメニューから「Developer PowerShell for VS 2022」を検索(または類似の名前)
  1. 右クリックして「管理者として実行」を選択
  2. 以下のコマンドを実行して署名ツールのディレクトリに移動:
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64"

(注: バージョン番号「10.0.26100.0」は実際にインストールされたものと異なる場合があります。正確なパスはエクスプローラで確認してください)

  1. 次のコマンドで署名を実行:
.\signtool.exe sign /tr http://timestamp.globalsign.com/tsa/r6advanced1 /fd sha256 /td sha256 /n "あなたの証明書名" "C:\署名対象のパス\ファイル名.exe"

以下のパラメータを実際の情報に置き換えてください:

  • /n "あなたの証明書名" – 証明書発行時に設定した正確な名前
  • "C:\署名対象のパス\ファイル名.exe" – 署名したいファイルのフルパス
  1. コマンド実行後、PINの入力を求められる場合があります。USBトークン設定時に設定したPINを入力してください。

署名の確認

  1. 署名したファイルをエクスプローラで右クリック
  2. 「プロパティ」を選択
  3. 「デジタル署名」タブが表示されていれば署名成功
  4. タブをクリックして詳細を確認し、証明書情報が正しいか確認

トラブルシューティング

USBトークンが認識されない場合

  1. UTMの「デバイス」メニューでUSBトークンが選択されているか確認
  2. Mac側でUSBトークンが正常に認識されているか確認:
    • macOSの「システム情報」アプリで「USB」セクションを確認
  3. Windows内でデバイスマネージャーを開き、USBデバイスに警告マークがないか確認
  4. USBトークンを抜き差しして再接続
  5. UTMの再起動、または仮想マシンの再起動を試す

署名コマンドがエラーになる場合

  1. 証明書名が正確でない:

    • /n パラメータの後の名前を正確に証明書の名前と一致させる
    • 証明書の詳細はSafenet Client内で確認可能
  2. タイムスタンプサーバーエラー:

    • 以下のグローバルサインの正式なタイムスタンプサーバーURLを使用:
      http://timestamp.globalsign.com/tsa/r6advanced1
    • インターネット接続が正常か確認
  3. ファイルが実行ファイルでない:

    • 署名できるのは正規の実行ファイル(.exe, .dll, .ocx, .msi など)のみ
    • テキストファイルの拡張子を変えただけのファイルは署名できない
  4. 管理者権限がない:

    • PowerShellを「管理者として実行」で起動しているか確認

まとめ

  • Mac上の仮想環境でWindowsを実行し、コード署名が可能
  • UTMを使用すれば無料で環境構築が可能
  • USBトークンのパススルー設定が重要
  • 署名コマンドのパラメータは正確に指定する必要がある

この方法を使えば、Macユーザーでも物理的なWindowsマシンを用意することなく、グローバルサインの証明書を使ったコード署名が可能になります。一度環境を構築してしまえば、今後も繰り返し利用できます。

参考資料