# BYOCプランでのTLS/SSL設定

MQTTエコシステム内のデータ通信の機密性を保護するために、EMQX BYOCプランではSSLおよびTLS暗号化プロトコルを使用した安全で暗号化された通信チャネルの確立をサポートしています。本ページでは、MQTTシステム内での安全な通信を確保するために、片方向認証および双方向認証モードでのTLS/SSL通信の有効化方法を紹介します。

以下の表は、片方向認証モードと双方向認証モードにおける異なる証明書要件の概要を示しています。

| 認証モード             | 自己署名証明書           | サーバー証明書       | 証明書チェーン       | 秘密鍵           | クライアントCA証明書     |
| ---------------------- | ----------------------- | -------------------- | -------------------- | ---------------- | ------------------------ |
| 片方向認証             | 可                      | 必須                 | 必須                 | 必須             | 不要                     |
| 双方向認証             | 可                      | 必須                 | 必須                 | 必須             | 必須                     |

## 片方向認証モード

片方向認証は、TLS/SSLハンドシェイク時にサーバー（EMQX MQTTブローカー）が有効な証明書をクライアント（デバイスやアプリケーション）に提示することを保証します。クライアントは提示された証明書を信頼できる認証局（CA）と照合してサーバーの真正性を検証します。

BYOCプランでは、信頼されたCAによって署名された証明書のみが受け入れられます。これによりセキュリティが強化され、MQTTクラスターへの不正アクセスを防止します。

### 必要な証明書コンポーネント

BYOC環境でTLS/SSLを設定するには、以下のコンポーネントを含む単一のPEMファイルを準備する必要があります。このPEMファイルは、MQTTクライアントとEMQX MQTTブローカー間の安全な片方向認証を有効にするために重要です。

1. **サーバー証明書**：信頼された認証局（CA）によって発行され、EMQX MQTTブローカーがクライアントと安全な接続を確立するために使用されます。

2. **証明書チェーン**：信頼されたルートCA証明書までの完全な証明書チェーンを含めます。これによりクライアントデバイスがサーバー証明書の真正性を検証できます。

3. **秘密鍵**：サーバー証明書に関連付けられた秘密鍵で、クライアントとEMQX MQTTブローカー間の通信の復号に必要です。

### 証明書の形式と標準ガイドライン

TLS/SSL設定用の証明書を準備する際は、以下のガイドラインに従ってください。

- 証明書は暗号化アルゴリズムと鍵長を指定する必要があります。EMQX BYOCは1024ビットRSA（RSA_1024）および2048ビットRSA（RSA_2048）アルゴリズムをサポートしています。

- 証明書はSSL/TLS X.509バージョン3標準に準拠している必要があります。公開鍵、完全修飾ドメイン名（FQDN）またはIPアドレス、発行者情報を含む必要があります。

- 証明書は自己署名（秘密鍵を用いて）または発行CAの秘密鍵で署名できます。CAによって署名された場合は、証明書をインポートする際に証明書チェーンを含める必要があります。

- 証明書は有効である必要があり、有効期間の開始または終了の**30日以内**にインポートしてはいけません。

- 証明書、秘密鍵、証明書チェーンは**PEMエンコード**である必要があります。

- 秘密鍵はパスワードなしで、PKCS#1およびPKCS#8をサポートしている必要があります。

- 証明書の暗号化アルゴリズムは署名CAの暗号化アルゴリズムと一致する必要があります。例えば、署名CAがRSAを使用している場合、証明書の鍵タイプもRSAである必要があります。

これらのガイドラインは、BYOC環境でのTLS/SSLの適切な設定と安全なデプロイを保証します。

<!-- ## PEMファイルの作成

必要なPEMファイルを作成するには、以下の手順に従ってください。

1. テキストエディタを開きます。
2. サーバー証明書の内容をコピーし、エディタに貼り付けます。
3. 証明書チェーンの内容をコピーし、サーバー証明書の下に貼り付けます。
4. 秘密鍵の内容をコピーし、証明書チェーンの下に貼り付けます。

作成されるPEMファイルの構造は以下の通りです。

```txt
-----BEGIN CERTIFICATE-----
Base64エンコードされたサーバー証明書の内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Base64エンコードされた証明書チェーンの内容
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
Base64エンコードされた秘密鍵の内容
-----END RSA PRIVATE KEY-----
```
-->

### "byoc create"コマンドでのPEMファイル使用方法

BYOCデプロイ時には、PEMファイルをUbuntu環境のディレクトリにコピーし、`./byoc create`コマンドを実行する前にアクセス可能な状態にしてください。`./byoc create`コマンドを使用してBYOC環境をデプロイする際、パラメータ`--sslCertPath`にPEMファイルの絶対パスを指定する必要があります。パラメータの設定方法の詳細は[デプロイの実行](../create/byoc.md#run-deployment)をご参照ください。

## 双方向TLS/SSLの設定

以下の手順では、[EMQX Platform Console](<https://cloud-intl.emqx.com/console>)で双方向TLS/SSLを設定し、TLS/SSL構成済みのクライアント接続をテストする方法を案内します。また、セットアップの各ステップを解説した[双方向TLS/SSLチュートリアル](https://www.youtube.com/embed/VzygGJXgVI4/?autoplay=1&null)もご覧いただけます。

1. EMQX Platform Consoleにログインします。
2. デプロイの**概要**ページで、**+TLS/SSL Config**ボタンをクリックして証明書を設定します。ファイルをアップロードするか、証明書の内容を直接入力できます。
   - **TLS/SSLタイプ**：双方向（クライアントとサーバーがお互いの証明書を検証）を選択します。
   - **証明書および証明書チェーン**：カスタムのサーバー側証明書（証明書発行時に第三者機関から提供された証明書チェーンを含む）。
   - **証明書秘密鍵**：秘密鍵。
   - **クライアントCA証明書**：双方向を選択した場合、クライアントCA証明書を提供する必要があります。
3. すべての項目を入力後、**確認**をクリックします。デプロイの概要ページにて、**TLS/SSL Config**に証明書情報が表示されます。

### MQTTXクライアントで双方向TLSをテスト

テスト前に認証情報を作成していることを確認してください。詳細は[認証](./auth_overview.md)を参照してください。[MQTTXクライアント](https://mqttx.app/)を使用してEMQX Platformに接続し、TLS/SSL設定をテストできます。

1. MQTTXクライアントで新しい接続を作成します。

   **General**セクションに以下の情報を入力します。

   - **Name**：接続名を入力します。
   - **Client ID**：クライアントIDはランダム生成されます。再生成したい場合はリフレッシュボタンをクリックしてください。
   - **Host**：ドロップダウンリストからプロトコルを選択し、デプロイ済みの接続アドレスとポートを入力します。
     - MQTT over TLSを使用する場合は、`mqtts://`およびポート`8883`を選択します。
     - WebSocket over TLSを使用する場合は、`wss://`およびポート`8084`を選択します。

   - **Username**および**Password**：作成済みの認証情報を入力します。
   - **SSL/TLS**：トグルスイッチをクリックしてSSL/TLSを有効にします。
   - **SSL Secure**：トグルスイッチをクリックしてSSL Secureを有効にします。
   - **Certificate**：必要に応じて証明書を選択します。
     - サーバー側CAがCA機関によって認証されている場合は、**Self signed**を選択し、**CA File**フィールドに証明書を入力します。自己署名のTLS/SSL証明書の作成方法は[自己署名TLS/SSL証明書の作成](#create-self-signed-tsl-ssl-certificate)を参照してください。
     - 自己署名のサーバー側証明書の場合は、**Self signed**を選択して自己署名のサーバー側CA証明書を提供します。
     - 双方向TLSではクライアント証明書ファイルとクライアント鍵ファイルも入力する必要があります。

2. **Connect**をクリックします。

![mqttx_tls](./_assets/mqttx_tls_shuang.png)

## 自己署名TLS/SSL証明書の作成

以下の手順では自己署名TLS/SSL証明書の作成方法を案内します。セットアップの各ステップを解説した[自己署名TLS/SSL証明書作成チュートリアル](https://www.youtube.com/embed/kYL0pQ0GC3k/?autoplay=1&null)もご覧いただけます。

::: tip 前提条件

[OpenSSL](https://www.openssl.org/)がインストールされていることを確認してください。

:::

### サーバー側CA証明書の生成

以下のコマンドを使用してサーバー側CA証明書を生成できます。`subj`は実際の用途に合わせて調整してください。

```bash
openssl req \
    -new \
    -newkey rsa:2048 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=CN/O=EMQ Technologies Co., Ltd/CN=EMQ CA" \
    -keyout server-ca.key \
    -out server-ca.crt
```

### サーバー側証明書の作成

1. サーバー側秘密鍵`server.key`を生成します。

```bash
openssl genrsa -out server.key 2048
```

2. `openssl.cnf`ファイルを作成します。`IP.1`または`DNS.1`のアドレスをデプロイ先のアドレスに置き換えてください。

```
cat << EOF > ./openssl.cnf
[policy_match]
countryName             = match
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[req]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext
x509_extensions    = v3_req
prompt             = no

[req_distinguished_name]
commonName          = Server

[req_ext]
subjectAltName = @alt_names

[v3_req]
subjectAltName = @alt_names

[alt_names]
# EMQXデプロイ接続アドレス
# IP.1 = <IP接続アドレス>
DNS.1 = <ドメイン接続アドレス>
EOF
```

3. サーバー側証明書要求ファイル`server.csr`を生成します。

```bash
openssl req -new -key server.key -config openssl.cnf -out server.csr
```

4. CA証明書でサーバー側証明書`server.crt`に署名します。

```bash
openssl x509 -req \
    -days 365 \
    -sha256 \
    -in server.csr \
    -CA server-ca.crt \
    -CAkey server-ca.key \
    -CAcreateserial -out server.crt \
    -extensions v3_req -extfile openssl.cnf
```

5. サーバー側証明書情報を表示します。

```bash
openssl x509 -noout -text -in server.crt
```

6. 証明書を検証します。

```bash
openssl verify -CAfile server-ca.crt server.crt
```

### クライアント証明書の作成

双方向認証には、まずクライアントCA証明書を生成する必要があります。

#### クライアントCA証明書の生成

以下のコマンドを使用してクライアントCA証明書を生成できます。`subj`は実際の用途に合わせて調整してください。

```bash
openssl req \
    -new \
    -newkey rsa:2048 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=CN/O=EMQ Technologies Co., Ltd/CN=EMQ CA" \
    -keyout client-ca.key \
    -out client-ca.crt
```

1. クライアント側秘密鍵`client.key`を生成します。

```bash
openssl genrsa -out client.key 2048
```

2. クライアント側証明書要求ファイル`client.csr`を生成します。

```bash
openssl req -new -key client.key -out client.csr -subj "/CN=Client"
```

3. CA証明書でクライアント側証明書`client.crt`に署名します。

```bash
openssl x509 -req -days 365 -sha256 -in client.csr -CA client-ca.crt -CAkey client-ca.key -CAcreateserial -out client.crt
```

4. クライアント側証明書情報を表示します。

```bash
openssl x509 -noout -text -in client.crt
```

5. 証明書を検証します。

```bash
openssl verify -CAfile client-ca.crt client.crt
```

## 証明書の削除

証明書を削除すると、ポート`8883`および`8084`でのクライアント接続が切断されます。削除が業務に影響を与えないことを必ず確認してください。

1. [EMQX Platform Console](<https://cloud-intl.emqx.com/console>)にログインします。
2. **TLS/SSL Config**セクションの証明書の削除アイコンをクリックします。
3. ダイアログで**OK**をクリックして削除を完了します。
