# ネットワークとTLS

IoTシナリオにおけるエンドツーエンドの暗号化通信にはセキュリティが不可欠です。Secure Sockets Layer（SSL）およびTransport Layer Security（TLS）プロトコルは、データ伝送の機密性を確保し、攻撃者による傍受や改ざんを防ぐためにネットワーク通信でよく採用されます。SSL/TLS暗号化機能はトランスポート層でネットワーク接続を暗号化し、関係者の身元を認証するためのデジタル証明書の使用と、安全な通信チャネルの確立を伴います。

EMQXは以下の場合に安全なネットワーク通信を保証するためにSSLおよびTLS暗号化プロトコルを採用しています。

- MQTTクライアントとEMQX間の接続確立時
- データベースなど外部リソースへの接続時
- クラスター内の異なるEMQXノード間の通信時

EMQXは一方向／双方向認証およびX.509証明書認証を含むSSL/TLS機能を包括的にサポートしています。

## クライアント接続のためのTLS

EMQXはMQTTクライアント接続に対してSSL/TLS暗号化をサポートし、クライアントとブローカー間の安全な暗号化通信を実現します。TLSリスナーは、セキュリティ要件に応じて一方向認証（サーバー認証のみ）または双方向認証（mTLS）をサポートするように設定可能です。

本章の[Enable SSL/TLS Connections](./emqx-mqtt-tls.md)では、ダッシュボードおよび設定ファイルを用いたTLSリスナーの設定手順を段階的に解説しています。

### 証明書管理

EMQXはSSL/TLSのための統一された証明書管理モデルを提供しており、証明書の取得、保存、管理、リスナーやその他TLS対応コンポーネント間での再利用方法をカバーしています。これは従来のパスベース証明書だけでなく、集中管理されたライフサイクル管理を持つ管理証明書も含みます。

EMQXにおける証明書の概念とワークフローの全体像については、[SSL/TLS Certificates](./tls-certificate.md)をご参照ください。

### 証明書検証と失効確認

TLSセキュリティをさらに強化するため、EMQXは証明書検証および失効確認をサポートしています。

- **CRLチェック**：証明書失効リストを用いて証明書が失効していないかを検証します。詳細は[CRL Check](./crl.md)をご覧ください。
- **OCSP Stapling**：オンライン証明書状態プロトコルを用いて証明書の失効状況を確認します。詳細は[OCSP Stapling](./ocsp.md)をご覧ください。

これらの機能はTLSリスナー設定時に有効化可能で、侵害された証明書の使用を防止します。

### クライアント側TLSの例

[Client TLS](./mqtt-client-tls.md)セクションでは、SSL/TLSを用いてEMQXに安全に接続するためのMQTTクライアントコード例やサンプルプロジェクトを提供しています。クライアント証明書やTLSオプションの設定に関する実践的なガイダンスも含まれています。

## 外部リソースアクセスのためのTLS

EMQXはHTTPベースの認証サービス、データベース、その他データ統合サービスなどの外部リソースへのアクセス時にもSSL/TLS暗号化をサポートしています。対応機能の設定時にダッシュボードから**Enable TLS**オプションを有効化することでTLSを利用可能です。

### ダッシュボードでのTLS設定オプション

TLSを有効化すると、以下のオプションが利用可能になります。

- **TLS Verify**：外部リソースのサーバー証明書を検証するかどうかを制御します。有効にするとEMQXはサーバーの証明書チェーンを検証します。
- **Middle Box Compatibility Mode**：TLS 1.3接続の互換モードを有効化します。一部のネットワークミドルボックスは標準のTLS 1.3ハンドシェイクを正しく処理できない場合があります。このオプションを有効にすると、EMQXはTLS 1.3ハンドシェイクをTLS 1.2に似せて適応し、そのような環境での接続成功率を向上させます。
- **SNI**：サーバーネームインジケーション。TLSハンドシェイク時にサーバードメイン名と証明書が一致するかどうかを検証します。空欄の場合はホスト名検証を行いません。
- **Certificate Source**：クライアント証明書が必要な場合の提供方法を指定します。
  - **Enter Manually**：証明書の内容またはファイルを直接入力。
  - **Select from Managed Certs**：EMQXが集中管理する証明書バンドル（EMQX 6.1以降）から参照。証明書の再利用やローテーションが容易になります。証明書バンドルの作成・管理については[Managed Certificates](./tls-certificate.md#managed-certificates)をご覧ください。
- **TLS Cert / TLS Key**：外部サーバーがクライアント証明書を検証する（相互TLS）場合に必要です。
- **CA Cert**：**TLS Verify**が有効な場合にサーバー証明書の検証に使用します。

<img src="./assets/enable-TLS-dashboard.png" alt="TLS有効化ダッシュボード" style="zoom:50%;" />

### 設定ファイルによるTLS設定

外部リソースアクセスに対しても、設定ファイルの対応する`ssl`オプションを設定することでTLSを有効化できます。例えばHTTPベース認証バックエンドの設定例は以下の通りです。

```hocon
authentication {
  url = "https://127.0.0.1:8080"
  backend = "http"

  ...

  ssl {
    enable = true
    cacertfile = "etc/certs/cacert.pem"
    certfile = "etc/certs/cert.pem"
    keyfile = "etc/certs/key.pem"
    verify = verify_peer
  }
}
```

**SSL設定項目の説明**：

- **`enable`**：外部リソースへのアウトバウンド接続に対してSSL/TLSを有効化します。
- **`cacertfile`**：HTTPクライアントがHTTPサーバーの正当性を検証するために使用する信頼済み認証局（CA）証明書をPEM形式で格納したファイルのパス。
- **`certfile`**：クライアントが提示するSSL/TLS証明書チェーンをPEM形式で格納したファイルのパス。証明書がルートCAから直接発行されていない場合、中間CA証明書をクライアント証明書の後に連結して完全なチェーンを形成する必要があります。
- **`keyfile`**：`certfile`で指定したクライアント証明書に対応するPEM形式の秘密鍵ファイルのパス。
- **`verify`**：サーバー証明書検証の挙動を制御します。
  - **`verify_peer`**：サーバーの証明書チェーンを検証します。
  - **`verify_none`**：サーバー証明書の検証を行いません。

管理証明書はリスナーで使用する証明書管理モデルと同様に設定ファイル内でも参照可能です。設定オプションの詳細については[Enable SSL/TLS with One-Way Authentication](./emqx-mqtt-tls.md#enable-via-configuration-file)のリスナー設定例をご参照ください。

## ノード間通信のためのTLS

クラスター接続に対するSSL/TLS有効化手順は本章では扱っておらず、詳細は[Cluster Security](../cluster/security.md)をご参照ください。

## IPv6サポート

EMQXはクライアント接続、ダッシュボード、ノード間クラスター通信、外部サービスへのアウトバウンド接続に対してIPv6を完全にサポートしています。設定の詳細は[IPv6](./ipv6.md)をご覧ください。
