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 接続に必要な秘密鍵・証明書を出力します。
手順:
- Unreal Editor の
Tools -> Generate TLS Certificateを開きます。 - 出力先フォルダを選択します(
Content/配下は避け、専用フォルダを推奨)。 - 警告ダイアログを確認して実行します。
- 選択したフォルダに以下のファイルが生成されます。
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を参照してください。