deslarnetのtech blog

慌てず、急いで、正確にな

MacのVivaldiでMailvelopeを用いてYubiKeyのPGP鍵を使用する

タイトル通りだが、躓くポイントがあったので備忘録としてまとめておく。

Mailvelopeについて

MailvelopeはWebメールのトラフィックをOpenPGPによりエンドツーエンド暗号化するオープンソース ソフトウェアで、ブラウザのアドオン(拡張機能)として動作する。公式サイトによればブラウザはChrome、Edge、Firefoxがサポートされており*1、WebメールサービスはGmail、Yahoo、Outlook.com等に対応している。こうしたWebメールサービスは便利な反面、サービスプロバイダーによって情報収集される可能性が否定できず、メールがどのくらい安全かが不明瞭である。Mailvelopeを用いたエンドツーエンド暗号化によってWebメールの安全性を高めることができる。

準備するもの

  • Mac(mac OS Ventura 13.4.1 (c))Homebrewがインストールされているものとする
  • 以前紹介したような手順で秘密鍵を保存したYubiKey

WebブラウザはVivaldiを使用した。

Mailvelopeの導入

Chrome ウェブストアからMailvelopeを検索し、インストールする。

GnuPGのインストール

gpgmeとGnuPGをインストールする必要がある。Homebrewがインストールされていれば、ターミナルでbrew install gpgmeと入力しgpgmeをインストールする。もしGnuPGがインストールされていなければ、同時にGnuPGもインストールされる。

pinentry-macのインストール

pinentryは、ダイアログ表示を介して接続すべきスマートカードのシリアル番号を示したり、PIN等の値を対話的に取得したりするためのプログラムである。

画像:pinentry-macのダイアログの例

gpgmeをインストールするとpinentryがインストールされるが、pinentryではターミナル内で動作するのみで、Mailvelopeでは動作しないため、pinentry-macをインストールする必要がある。brew install pinentry-macでインストールできる。
gpg-agent.confファイルを以下の内容で作成し、~/.gnupgに保存する。

pinentry-program /opt/homebrew/bin/pinentry-mac

GPGToolsが開発するGPG Suite(WindowsにおけるGpg4winに相当するものと考えてよい)というものもあり、これをインストールすると、pinentry-macも同時にインストールされるが、検証環境ではダイアログが表示されるものの、正しく動作しなかった(今回の用途においてはGPG Suiteをインストールする必要はない)。

マニフェストファイルの作成と配置

Mailvelopeがgpgmeと正常に通信するためには、ブラウザアプリケーションのマニフェストファイルが必要である。このファイルには、ネイティブメッセージングアプリgpgme-jsonへのパスと、許可されたブラウザ拡張機能 ID が含まれる。Apple SiliconなMacにおいては、マニフェストファイルgpgmejson.jsonを以下の内容で作成する。

{
    "name": "gpgmejson",
    "description": "Integration with GnuPG",
    "path": "/opt/homebrew/bin/gpgme-json",
    "type": "stdio",
    "allowed_origins": [
        "chrome-extension://kajibbejlbohfaggdiogboambcijhkke/"
    ]
}

今回はVivaldiに設定するので、作成したファイルをディレクトリ~/Library/Application Support/Vivaldi/NativeMessagingHostsに保存する。ここまでの手順を行うことでMailvelopeがGnuPGと連携するので、Outlook.comで正しく動作するか確認を行う。

画像:Outlook.com上でMailvelopeで署名・暗号化した本文を復号・検証したもの

結語

Apple SiliconなMacのVivaldiにMailvelopeをインストールし、YubiKeyを用いて暗号化、署名、検証、復号できた。

参考にしたサイト

github.com

*1:今回Vivaldiで検証できたので、Chromium系のブラウザでは動作可能なのかもしれない。