TLSオプションはユースケースごとにどう設定すべきですか?

ObjectDeliverer v1.9.0 以降では、TCP/IP TLS サーバー/クライアントを利用できます。

このページでは、TLS通信で「どのユースケースでどのオプションを使うべきか」をまとめます。

前提: 使える主なオプション

クライアント側 (UProtocolTcpIpClientTls)

  • WithCertificateVerification()
    • 証明書チェーン検証を有効化します。
  • WithTrustedCaCertificate(path)
    • OS標準の信頼ストアにないプライベートCAを信頼する場合に使います。
  • WithAllowSelfSignedCertificates(true)
    • 自己署名証明書を許可します。
  • WithPinnedPublicKey(...) / WithPinnedPublicKeyFromFile(...)
    • サーバー公開鍵のピンニングです。
  • WithPeerVerificationDisabled()
    • 証明書検証を無効化します。検証用途以外では非推奨です。
  • WithClientCertificate(certPath, keyPath)
    • mTLS でクライアント証明書を送る時に使います。

サーバー側 (UProtocolTcpIpServerTls)

  • WithClientAuthMode(None / Optional / Required)
    • クライアント証明書の要求レベルを設定します。
  • WithClientCaBundle(path)
    • クライアント証明書を検証するためのCA証明書を指定します(mTLS用)。

ユースケース別の推奨設定

1. 本番環境(公開サーバー、CA署名証明書)

最も標準的な構成です。

背景:

  • 多くのユーザー環境では、OSやブラウザと同様に「信頼されたCAで署名された証明書」を前提にするのが最も運用しやすいです。

  • クライアントは「通信が暗号化されているか」だけでなく「本物のサーバーか」を同時に確認する必要があります。

  • クライアント:

    • WithCertificateVerification()
  • サーバー:

    • CreateProtocolTcpIpServerTls(port, certPath, keyPath, minimumProtocol)

ポイント:

  • InitializeTls() のホスト名/IP と、証明書の SAN/CN を一致させてください。
  • プライベートCA運用ならクライアントに WithTrustedCaCertificate(...) を追加します。

この構成で防げること:

  • なりすましサーバーへの接続(証明書検証で拒否)
  • 通信経路での盗聴・改ざん(TLSで保護)

2. 社内・閉域網(プライベートCA)

公開CAではなく社内CAを使う構成です。

背景:

  • 社内ネットワークや工場・研究用途では、公開CAではなく独自CAで証明書を発行することがよくあります。

  • その場合、クライアント側に「このCAは信頼してよい」という設定を明示しないと接続できません。

  • クライアント:

    • WithCertificateVerification()
    • WithTrustedCaCertificate(caCertPath)

ポイント:

  • テストでも本番でも、CA証明書の配布と更新手順を決めておくと運用が安定します。

この構成で防げること:

  • 社内CA以外で署名された不正サーバーへの誤接続
  • 「暗号化されているだけで相手確認がない」状態

3. 開発環境(自己署名証明書)

開発中によく使う構成です。

背景:

  • ローカル検証では、公開CAや社内CAを毎回準備せず自己署名証明書を使いたいケースが多いです。

  • ただし自己署名証明書は第三者保証がないため、許可するだけでは「誰の証明書か」を判定しきれません。

  • クライアント:

    • WithCertificateVerification()
    • WithAllowSelfSignedCertificates(true)
    • WithPinnedPublicKey(...) または WithPinnedPublicKeyFromFile(...)

ポイント:

  • 自己署名を許可しただけでは接続できません。公開鍵ピンニングが必要です。
  • 実装テストでも、この組み合わせで接続成功/失敗(不一致時)を検証しています。

この構成で防げること:

  • 開発環境でのなりすましサーバー接続(ピンニング不一致で拒否)
  • 「自己署名なので何でも許可」になる設定ミス

4. 一時的な接続確認だけしたい(非推奨構成)

疎通確認を最優先したい時のみ使ってください。

背景:

  • 証明書準備前に「ネットワーク経路やポートが開いているかだけ」確認したい場面があります。

  • その場しのぎとしては有効ですが、セキュリティ上の本人確認を捨てる設定です。

  • クライアント:

    • WithPeerVerificationDisabled()

ポイント:

  • 中間者攻撃に弱くなるため、本番運用には使わないでください。
  • 検証が終わったら、必ず WithCertificateVerification() を有効化した設定へ戻してください。

5. 双方向TLS (mTLS) でクライアント認証したい

接続クライアントを証明書で制御したい場合の構成です。

背景:

  • 通常のTLSは主に「サーバーが本物か」をクライアントが確認する仕組みです。

  • mTLSではサーバー側もクライアント証明書を検証するため、相互認証になります。

  • その結果、サーバーにとっては「知らないクライアントを接続させない」、クライアントにとっては「なりすましサーバーを避ける」を同時に実現できます。

  • サーバー:

    • WithClientAuthMode(Required) または WithClientAuthMode(Optional)
    • WithClientCaBundle(caCertPath)
  • クライアント:

    • WithCertificateVerification()
    • WithTrustedCaCertificate(serverCaPath)
    • WithClientCertificate(clientCertPath, clientKeyPath)

使い分け:

  • Required: クライアント証明書が必須。無い/不正な場合は拒否。
  • Optional: 証明書があれば検証、無くても接続は許可。

この構成で防げること:

  • 未登録クライアントや証明書不正クライアントの接続
  • サーバー/クライアントどちらか片側だけを偽装する攻撃

よくある設定ミス

  • InitializeTls("localhost", ...) で接続しているのに証明書が 127.0.0.1 しか持っていない
    • ホスト名検証に失敗します。
  • 自己署名で WithAllowSelfSignedCertificates(true) だけ設定した
    • ピンニング不足で接続できません。
  • mTLS で WithClientAuthMode(Required) にしたのに WithClientCaBundle(...) を設定していない
    • クライアント証明書を正しく検証できません。

参考: 最小構成のイメージ

auto ServerProtocol = UProtocolFactory::CreateProtocolTcpIpServerTls(
    8443, ServerCertPath, ServerKeyPath, EObjectDelivererTlsProtocol::TLSv1_2);

auto ClientProtocol = UProtocolFactory::CreateProtocolTcpIpClientTls(
    TEXT("localhost"), 8443, false, false, EObjectDelivererTlsProtocol::TLSv1_2);

ClientProtocol->WithCertificateVerification();
ClientProtocol->WithAllowSelfSignedCertificates(true);
ClientProtocol->WithPinnedPublicKey(PublicKeyHash);

参考: ObjectDelivererEditor で OpenSSL を使った鍵/証明書を作る

ObjectDeliverer v1.9.0 以降では、ObjectDelivererEditor の Tools -> Generate TLS Certificate から自己署名証明書を作成できます。
この機能は内部で OpenSSL ライブラリを使い、TLS 接続に必要な秘密鍵・証明書を出力します。

手順:

  1. Unreal Editor の Tools -> Generate TLS Certificate を開きます。
  2. 出力先フォルダを選択します(Content/ 配下は避け、専用フォルダを推奨)。
  3. 警告ダイアログを確認して実行します。
  4. 選択したフォルダに以下のファイルが生成されます。
    • server.crt(サーバー証明書)
    • server.key(サーバー秘密鍵)
    • server.pubkey.txt(公開鍵ハッシュ。WithPinnedPublicKeyFromFile(...) にそのまま利用可能)

使い方:

  • TLS サーバー側は CreateProtocolTcpIpServerTls(..., certPath, keyPath, ...) に server.crt / server.key を設定します。
  • 自己署名を使うクライアント側は WithAllowSelfSignedCertificates(true) と WithPinnedPublicKeyFromFile(".../server.pubkey.txt") を併用します。

注意:

  • このメニューは開発/検証向けの自己署名証明書生成です(既定: 365日, CN=localhost)。
  • 本番運用や mTLS のクライアント証明書運用では、公開CAまたは社内CAで発行した証明書を使用してください。

OpenSSLコマンドで手動作成したい場合は、こちらのFAQを参照してください。