なぜRSAからEd25519に切り替えたのか(あなたもそうすべき理由)
セルフホストTLSに4096ビットRSAキーは不要です。BedrudがEd25519に移行した理由と、自己署名証明書にとってそれが何を意味するかを解説します。
ブラウザの警告を見たことがあるでしょう。「接続が安全ではありません。」セルフホストでは自己署名証明書は避けられない現実です。しかしその証明書に入っている鍵は、あなたが考える以上に重要です。そして、ほとんどのチュートリアルはいまだに間違ったデフォルト値を推奨しています。
RSAの慣性
インターネット上のセルフホスティングガイドはどれも同じことを言っています:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365RSA 4096。大きい数字ほど安全だから、でしょう?もうそうではありません。RSA 4096鍵は3.2 KBあります。5ドルVPSでは生成に数秒かかります。そして提供するセキュリティレベルは、256ビットの楕円曲線鍵とほぼ同じです。
RSAがデフォルトなのは歴史的慣性であって、技術的メリットではありません。どこでも動くのは事実で、CA発行の公開証明書ではその互換性は依然として重要です。しかし、自分で管理するスタック内の自己署名証明書については?不要な互換性のためにパフォーマンスの税を払っていることになります。
Ed25519の概要
Ed25519はCurve25519上に構築されたEdDSA署名スキームです。固定サイズの256ビット鍵を生成し、非常にコンパクトです。デジタル署名専用に設計されており、暗号化も鍵交換も行わず、署名だけを行います。この特化により、シンプルで高速、かつ設定ミスが起きにくくなっています。
Goでは第一級のサポートがあります。crypto/ed25519パッケージはGo 1.13から標準ライブラリに含まれています。鍵生成は2行で済みます。シリアライズには標準のx509.MarshalPKCS8PrivateKeyを使います。外部依存もCGoも特別なビルドタグも不要です。
3方式の比較
| 項目 | RSA 4096 / 2048 | ECDSA P-256 | Ed25519 |
|---|---|---|---|
| セキュリティ | ~112–128ビット。成熟、十分に研究済み。 | ~128ビット。NIST曲線。 | ~128ビット。サイドチャネル攻撃への耐性を設計。 |
| パフォーマンス | 最も遅い。大きな数値の演算。 | 検証はRSAの約10倍高速。 | 最速。Goで30k+/秒の署名。鍵が極小。 |
| 鍵サイズ | 2048または4096ビット。ディスク占有量大。 | 256ビット。コンパクト。 | 256ビット固定。最小フットプリント。 |
| 互換性 | 汎用的。どこでも動作。 | 良好。全モダンブラウザ/クライアント。 | 成長中。Go、SSH、モダンTLSで完全サポート。 |
| フォーマット | PKCS#8標準。 | PKCS#8 over SEC1。 | PKCS#8ネイティブ。 |
| 鍵の寿命 | より頻繁なローテーションが必要。 | より長期間の使用可。 | 他のEC曲線と同等。 |
| Goでの使いやすさ | 完全なx509サポート。 | KeyEnciphermentバグのリスク(下記参照)。 | 純粋。暗号化オプションなし。 |
出典:鍵タイプ解説、Goベンチマーク:RSA vs ECDSA vs Ed25519、SSH鍵アルゴリズム比較
ECDSA KeyUsageの罠
RSAからECDSAに切り替えるほぼ全員が引っかかるバグがあります。Goのcrypto/x509パッケージでは、RSA鍵は証明書テンプレートにKeyUsageDigitalSignatureとKeyUsageKeyEnciphermentの両方を設定する必要があります。このパターンをECDSAにそのままコピーすると — EC鍵にKeyUsageKeyEnciphermentを追加する — 一部のTLSクライアントが証明書を拒否します。EC鍵は鍵暗号化を行いません。この拡張は無意味であり、積極的に有害です。
Bedrudの証明書生成(server/internal/utils/tls.go)での修正は次の通りです:
func keyUsageForAlgo(algo KeyAlgorithm) x509.KeyUsage {
switch algo {
case KeyRSA2048, KeyRSA4096:
return x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment
default:
return x509.KeyUsageDigitalSignature
}
}Ed25519はdefaultケースに入ります。純粋なデジタル署名。誤設定の可能性のあるKeyEnciphermentオプションはありません。罠が一つ減ります。
5ドルVPSでの実害
Hetzner CX22(2 vCPU、4 GB RAM)では、差は測定可能です:
- 鍵生成:RSA 4096は約1〜2秒。Ed25519は1ミリ秒未満。初回起動時に自己署名証明書を生成する場合、これは重要です。
- TLSハンドシェイク:Ed25519は署名と検証が速く、ハンドシェイクレイテンシを削減します。多数のWebRTC接続を処理するサーバーでは、このミリ秒が積み重なります。
- ディスク占有:Ed25519秘密鍵はPEMエンコードで48バイト。RSA 4096鍵は3.2 KB。単一証明書では大した差ではありませんが、計算の重さの違いを反映しています。
Bedrudの対応
BedrudはデフォルトでEd25519自己署名証明書を生成します。GenerateSelfSignedCert関数は他の指定がない限りKeyEd25519を使用します。
別のアルゴリズムが必要な場合 — レガシークライアントとの互換性や内部ポリシーのため — は--key-algorithmフラグを使用してください:
bedrud run --key-algorithm rsa4096
bedrud run --key-algorithm ecdsa256対応値:ed25519(デフォルト)、ecdsa256、rsa2048、rsa4096。
RSAを使い続けるべきケース
RSAは死んでいません。以下のケースでは依然として必要です:
- 古いJavaクライアントでEd25519 TLSハンドシェイクをサポートしていない場合
- Android 7.0以前のデバイス(Nougat)で、TLSスタックにEd25519サポートがない場合
- 組込みデバイスで古いOpenSSLまたはmbedTLSビルドを使用している場合
- 企業環境でRSAのみを理解するTLS検査ミドルボックスがある場合
あなたのスタックがモダンであれば — Goバックエンド、Chromium系ブラウザ、最新のモバイルアプリ — Ed25519は重要なすべての環境で動作します。
まとめ
セルフホストインフラが2013年のチュートリアルのおかげで4096ビットRSA鍵を背負う必要はありません。Ed25519は速く、小さく、エラーが起きにくいです。Goの標準ライブラリが最適化しているのはこれです。管理されたスタック内の自己署名証明書において、RSAの互換性の主張は成り立ちません。
より良いデフォルトでセルフホスト。Bedrudをインストールして試してみてください。