本文へスキップ
ecdsa.com

S/MIME と OpenPGP の比較|メールの署名と暗号化

どちらもメールをエンドツーエンドで署名・暗号化します。S/MIME は CA が発行する証明書に依拠し、企業向けのクライアントに組み込まれています。OpenPGP はユーザー自身が検証する鍵に依拠し、組み込まれているツールはより限られています。
比較対象S/MIMEOpenPGP

S/MIME と OpenPGP のどちらを使うかは、エンドツーエンドのメールセキュリティを実現する 2 つの標準のどちらを選ぶかという問題です。S/MIME(RFC 8551)は、メッセージを暗号メッセージ構文(CMS)で包み、認証局が発行した X.509 証明書で人を識別します。OpenPGP(RFC 9580)は独自のパケット形式と、所有者が自分で生成して公開する鍵を使い、信頼はフィンガープリントの確認、他のユーザーによる署名、または受信者のドメインによって確立されます。

比較表

S/MIMEOpenPGP
仕様RFC 8551(S/MIME 4.0)、CMS(RFC 5652)RFC 9580(2024年)。ポスト量子は RFC 9980(2026年6月)。GnuPG は LibrePGP に準拠
鍵の格納形式CA が発行する X.509 証明書自己署名の OpenPGP 鍵。任意で他者による証明も可能
信頼の判断OS とメールクライアントのルートストアにある CA の階層フィンガープリントの確認、信用の輪、初回利用時の信頼、またはドメインの Web Key Directory
身元確認CA がメールボックスを検証(証明書の種類に応じて組織や個人も)デフォルトではなし。一部のディレクトリはメールアドレスを確認
鍵の入手方法署名付きメッセージに同梱して送信、社内ディレクトリ(GAL、LDAP)Web Key Directory、鍵サーバー、Autocrypt ヘッダー、手動での交換
分離署名のサイズ(以下で実測)署名者の証明書を含めて 907 バイト、含めずに 446 バイト147 バイト(Ed25519)
有効期間公的に信頼される証明書は最長 825 日所有者が決定し、延長可能
失効CA が公開する CRL または OCSP鍵の所有者が公開する失効署名
標準搭載のクライアントOutlook、Apple Mail、iOS のメールアプリ。一部の Workspace エディションの GmailThunderbird(78 以降)、Proton Mail。その他はアドオン経由
2026年に使用できるアルゴリズムS/MIME ベースライン要件のもとで RSA 2048 ビット以上、ECDSA P-256/384/521、EdDSA、ML-DSA、ML-KEMEd25519、X25519、Ed448、X448、RSA。複合方式の ML-DSA+Ed25519 と ML-KEM+X25519(RFC 9980)
コンテンツの暗号化AES-GCM が必須(RFC 8551)、互換性のために AES-CBCRFC 9580 の SEIPD v2 で AEAD(OCB が必須)

署名の実例

以下のスクリプトは、GnuPG 2.5.21 と OpenSSL 3.6.5 を使って同じ短いメッセージに両方の方式で署名し、それぞれの署名を検証します。鍵と使い捨ての CA は一時ディレクトリに作成し、終了後に削除します。

OpenPGP と S/MIME(CMS)で署名する
#!/bin/sh
dir=$(mktemp -d)
cd "$dir" || exit 1
export GNUPGHOME="$dir/gnupg"
mkdir -m 700 "$GNUPGHOME"
printf 'Quarterly report attached.\n' > msg.txt

echo "== OpenPGP (GnuPG)"
gpg --batch --quiet --passphrase '' --quick-gen-key "Alice <alice@example.org>" ed25519 sign 1d
gpg --batch --quiet --detach-sign msg.txt
gpg --batch --verify msg.txt.sig msg.txt 2>&1 | grep -E "using|Good"
echo "signature bytes: $(wc -c < msg.txt.sig)"
gpgconf --kill gpg-agent

echo "== S/MIME (OpenSSL CMS)"
EC="-newkey ec -pkeyopt ec_paramgen_curve:P-256 -noenc"
openssl req -x509 $EC -keyout ca.key -out ca.pem -days 30 -subj "/CN=Example Mail CA" \
  -addext "keyUsage=critical,keyCertSign" 2>/dev/null
openssl req -x509 $EC -CA ca.pem -CAkey ca.key -keyout alice.key -out alice.pem -days 30 \
  -subj "/CN=Alice" -addext "subjectAltName=email:alice@example.org" \
  -addext "keyUsage=critical,digitalSignature" \
  -addext "extendedKeyUsage=emailProtection" 2>/dev/null
openssl cms -sign -binary -in msg.txt -signer alice.pem -inkey alice.key -outform DER -out msg.p7s
openssl cms -verify -binary -in msg.p7s -inform DER -content msg.txt -CAfile ca.pem -out /dev/null
echo "signature bytes: $(wc -c < msg.p7s)"
openssl cms -sign -binary -nocerts -in msg.txt -signer alice.pem -inkey alice.key -outform DER -out bare.p7s
echo "without the embedded certificate: $(wc -c < bare.p7s)"
cd / && rm -rf "$dir"
出力
== OpenPGP (GnuPG)
gpg:                using EDDSA key 57AE27428681EABC417A15B7DDA5B1FF5FAE8694
gpg: Good signature from "Alice <alice@example.org>" [ultimate]
signature bytes:      147
== S/MIME (OpenSSL CMS)
CMS Verification successful
signature bytes:      907
without the embedded certificate:      446

サイズの差は構造によるものです。CMS の署名には通常、署名者の証明書が含まれます。そのため、どの受信者も信頼できるルートに照らして署名を検証でき、返信を暗号化するためにその証明書を保存しておけます。証明書を含めなくても、署名時刻やコンテンツタイプなどの署名付き属性があるため、構造は大きくなります。OpenPGP の分離署名はフィンガープリントで鍵を指定するだけなので、受信者はその鍵をすでに持っているか、取得しなければなりません。40 文字のフィンガープリントは、GnuPG がバージョン 4 の鍵を作成したことを示しています。RFC 9580 のバージョン 6 の鍵では、64 文字の SHA-256 フィンガープリントが使われます。

誰を信頼するかの決め方

S/MIME は判断を認証局に委ねます。2023年9月1日以降、公的に信頼される S/MIME 証明書は CA/Browser Forum の S/MIME ベースライン要件に従っています。CA は各メールアドレスの管理権限を検証しなければならず、証明書の種類はメールボックス検証型から個人検証型まであり、要件の緩い「レガシー」プロファイルは 2025年7月15日以降は発行できなくなりました。また、加入者証明書の有効期間は最長 825 日です。企業は独自の CA を運用し、デバイス管理を通じて証明書を配布することもでき、大規模な S/MIME 導入のほとんどはこの方法で行われています。

OpenPGP は判断をユーザーに委ねます。ユーザーどうしが互いの鍵に署名する本来の信用の輪(web of trust)は、小さなコミュニティを超えて広がることはありませんでした。また、どんなアップロードも受け付けていた公開の鍵サーバーは、未検証の ID を扱う用途には使えなくなりました。現在の一般的な方法は、別の経路でフィンガープリントを照合する、初回利用時に鍵を受け入れる、または Web Key Directory で鍵を探す、のいずれかです。Web Key Directory では、受信者自身のドメインが HTTPS で鍵を提供します。keys.openpgp.org は、メールアドレスを確認してからでなければ ID を公開しません。

クライアント、互換性、OpenPGP の分裂

S/MIME の強みは統合されていることです。Outlook、Apple Mail、iOS のメールアプリは、証明書をインストールすれば標準機能で署名と暗号化を行えます。Gmail も、一部の Google Workspace エディションでホスト型の S/MIME を提供しています。OpenPGP は Thunderbird と Proton Mail に標準で組み込まれており、それ以外ではアドオンを通じて利用できます。

OpenPGP には標準の分裂という問題もあります。IETF は 2024年7月に、バージョン 6 の鍵、AEAD 暗号化の必須化、Argon2 によるパスフレーズ保護を盛り込んだ RFC 9580 を公開し、2026年6月にはポスト量子鍵のための RFC 9980 を公開しました。一方、GnuPG が実装しているのは LibrePGP で、そのバージョン 5 の鍵と OCB パケット形式は RFC 9580 とは異なります。従来の暗号化データパケットを使うバージョン 4 の鍵は、すべての実装で動作します。ただし GnuPG は、鍵で OCB パケットへの対応を表明している受信者に対しては、OCB パケットに切り替えることがあります。また、バージョン 6 の鍵などの RFC 9580 の機能は、やり取りする相手のソフトウェアでテストする必要があります。

どちらの標準も EFAIL(2018年)の影響を受けました。EFAIL は、細工した暗号文によって、メールクライアントに復号済みのテキストを HTML 経由で漏洩させるものです。恒久的な対策は、認証付き暗号(S/MIME 4.0 の AES-GCM、OpenPGP の改ざん検出コードと現在の AEAD)と、認証に失敗した平文を表示しないクライアントです。

どちらを選ぶべきか

  • 管理対象デバイスでの社内メール:S/MIME を使い、証明書は MDM で配布します。エスクローするのは暗号化鍵だけにし、署名鍵は決してエスクローしないでください。
  • すでに S/MIME 証明書を持っている外部パートナー(公的機関、銀行、医療機関):S/MIME を使います。
  • 個人、ジャーナリスト、オープンソースのメンテナー:OpenPGP を使い、鍵は WKD または keys.openpgp.org で公開します。
  • メールではなく、ファイル、バックアップ、シークレットの暗号化:どちらも使わず、age を使います(age と GPG の比較を参照してください)。
  • ソフトウェアのリリースとコミットへの署名:OpenPGP も引き続き使えますが、多くの場合は Sigstore や SSH 署名のほうが簡単です(Sigstore と GPG 署名の比較を参照してください)。
  • 件名の保護:どちらを選ぶ場合でも、ヘッダー保護(RFC 9788)を実装したクライアントを使ってください。そうしないと、件名は暗号化されないまま送られます。

移行時の注意点

  1. 新規の S/MIME 導入:サブジェクト代替名にメールアドレスを記載した、ストリクト(strict)またはマルチパーパス(multipurpose)プロファイルの証明書を申請します。また、署名鍵と暗号化鍵を分け、エスクローの対象を暗号化鍵だけにします。
  2. 既存の S/MIME ユーザー:レガシープロファイルで発行された証明書は、更新時に置き換えられつつあります。古い証明書の有効期限が切れる前に、パートナーのクライアントが新しいプロファイルを受け入れることを確認してください。
  3. OpenPGP 鍵:Ed25519 と X25519 の鍵(またはやり取りする相手のソフトウェアがすべて対応している場合はバージョン 6 の鍵)を生成し、有効期限を 1〜2 年に設定して延長していき、失効証明書をオフラインで保管し、WKD で公開します。
  4. アーカイブ:古いメールを読む必要がある限り、古い復号鍵や証明書を保持します。それらを廃止する唯一の方法は、アーカイブを再暗号化することです。
  5. ポスト量子暗号への移行計画:暗号化されたメールは harvest now, decrypt later(今収集し、後で解読)の危険にさらされています。ML-KEM は CMS 向けに(RFC 9936)、また X25519 と組み合わせて OpenPGP 向けに(RFC 9980)仕様化されています。暗号化鍵を先に、署名は後から計画します。OpenPGP インスペクターと S/MIME 署名検証ツールで、鍵、証明書、メッセージがどのアルゴリズムを使っているかを確認できます。

参考資料

すべての比較