EMQX CloudとMQTT Xによる双方向TLS/SSL
目次
Overview
EMQX Cloudは、世界初の完全ホスティング型MQTT 5.0クラウドメッセージングサービスです。EMQX Cloudのサポートにより、クラウド上にMQTTクラスタを作成し、EMQX Enterprise Editionの機能を利用することができます。これにより、ビジネス接続に多くの時間を割くことができ、EMQXの運用、保守、管理にかかる時間を短縮することができます。
今回は、EMQX Cloudのデプロイメントに、第三者認証によるTLS/SSLの双方向認証を設定します。
- 無料のサードパーティ認証局であるLet's Encryptを使用して、AWS Route 53から購入したカスタムドメインを認証し、EMQX Cloudのデプロイメントを指し示すことになります。
- クライアントサイドのTLS/SSLには、OpenSSLが使用されます。
- MQTT Xは、暗号化された接続を検証するために使用されます。
前提条件
- EMQX Cloud Professionalのデプロイメントが稼働していること:この例では、AWSへのデプロイメントが使用されます。
- インストールされているMQTTクライアント:この例では、MQTT Xが使用されます。
- 登録されたドメイン:この例では、AWS Route 53が使用されます。
クライアント側の自己署名証明書を作成する
以下のステップの他に、EMQX Cloud TLS/SSL ドキュメントを参照することも可能です。
# Create CA certificate
openssl req -new -newkey rsa:2048 \
-days 365 -nodes -x509 \
-subj "/C=US/O=Test Org/CN=Test CA" \
-keyout client-ca.key -out client-ca.crt
# Create private key
openssl genrsa -out client.key 2048
# Create certificate request file
openssl req -new -key client.key -out client.csr -subj "/CN=Client"
# Create client certifite by feeding the certificate request file to the newly created CA
openssl x509 -req -days 365 -sha256 -in client.csr -CA client-ca.crt -CAkey client-ca.key -CAcreateserial -out client.crt
# View and verify the client certificate
openssl x509 -noout -text -in client.crt
openssl verify -CAfile client-ca.crt client.crt
サブドメインをEMQXクラウド展開クラスタに向ける
EMQX CloudのコンソールからEMQX CloudのデプロイメントURLをコピーします。
AWS Route 53 hosted zoneにEMQX Cloudのデプロイメントを指すCNAMEレコードを作成します。
サブドメイン用の証明書を取得する
以下のステップに加え、Let's Encrypt /Certbot の certbot および Route 53 プラグインの説明もあります。ソフトウェア」のドロップダウンで「その他」を選択し、「ワイルドカード」タブを必ず選択してください。
CLIを使用して、パッケージマネージャー、Certbot、DNSプラグインをインストールします:
macOS:
# Install Homebrew if needed /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # Install certbot with brew brew install certbot # Install DNS plugin (discussion on why Homebrew doesn't work: https://github.com/certbot/certbot/issues/5680) $( brew --prefix certbot )/libexec/bin/pip install certbot-dns-route53
Ubuntu:
# Install snap if needed sudo snap install core; sudo snap refresh core # Install certbot with snap and configure it sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot sudo snap set certbot trust-plugin-with-root=ok # Install DNS plugin sudo snap install certbot-dns-route53
プラグインにAWSの権限を付与する:
次のステートメントでIAMポリシーを作成し、 YOURHOSTEDZONEID を変更します:
{ "Version": "2012-10-17", "Id": "certbot-dns-route53 policy", "Statement": [ { "Effect": "Allow", "Action": [ "route53:ListHostedZones", "route53:GetChange" ], "Resource": [ "*" ] }, { "Effect" : "Allow", "Action" : [ "route53:ChangeResourceRecordSets" ], "Resource" : [ "arn:aws:route53:::hostedzone/YOURHOSTEDZONEID" ] } ] }
新しいIAMユーザーを作成し、その権限に新しいポリシーを添付して、
Access key ID
とSecret access key
を保存します。CLIで新しいIAMユーザーの認証情報を環境変数として設定し、証明書を取得する:
export AWS_ACCESS_KEY_ID=AKIA---------EXAMPLE export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI-----------------EXAMPLEKEY certbot certonly --dns-route53 -d mqtt.YOURDOMAIN.COM
Certbotの証明書について理解する
fullchain.pem
: ドメインの認証に関わる証明書の完全なチェーン。通常、以下の方法で分解できる3つの証明書を含む:- 証明書本体(先頭):登録されたドメインの証明書。
- 中間証明書(2番目):Let's Encrypt用の証明書です。 ルート証明書(3番目):信頼できる認証局からの証明書で、ほとんどのOSやウェブブラウザにデフォルトで搭載されている認証局の中から選ばれた数種類に属します。
cert.pem
: フルチェーンからの最初の証明書です。chain.pem
: フルチェーンのうち、最初の証明書を除くすべての証明書。privkey.pem
:データの暗号化/復号化に使用します。
Let's Encryptの証明書チェーンに関する詳細情報は、こちらをご覧ください。
EMQX Cloudのデプロイメントで双方向TLS/SSLをセットアップする。
EMQX Cloudのコンソールで
+ TLS/SSL
をクリックします。タイプ」で「双方向」を選択し、前の手順で作成した証明書をEMQX Cloudの展開に追加し、「確認」をクリックします。
証明書の本文です: Let's Encryptの
cert.pem
です。Let's Encryptがサブドメイン用に作成した証明書です。証明書チェーンです:Let's Encryptの
fullchain.pem
の中間(2番目)の証明書です。このチェーンには、認証された(サブ)ドメインとルート証明書の間のすべての証明書を含める必要があり、この場合、1つだけであるべきです。証明書の秘密鍵:
privkey.pem
from Let's Encrypt.クライアントCA証明書です: クライアント CA 証明書:
client-ca.crt
ローカルで openssl を使用して以前に作成されたものです。配置に接続するクライアントも検証する必要があるため、配置はクライアント証明書をチェックするための信頼できる CA を知っておく必要があります。
MQTTで双方向のTLS/SSLをテストする X
デプロイメントに接続するためのユーザー名とパスワードが存在することを確認します。ユーザーを作成するためのヘルプは、こちらでご覧いただけます。
Let's Encrypt 証明書ディレクトリで、新しい
root.pem
ファイルを作成し、fullchain.pem
からルート (最後の) 証明書を追加します。MQTT Xを開き、新しい接続を作成します。
新規接続のプロンプトに適切な情報を入力し、「接続」をクリックします。
ホストとポート:TLSを使用しているため、
mqtts://
とポート8883
を選択します。ポート番号は EMQX Cloud のコンソールで確認できます。アドレス欄には、認証されたサブドメインを忘れずに追加してください。ユーザー名とパスワード:既存のEMQXクラウド導入ユーザーで記入します(ステップ1参照)。
SSLオプションの両方を有効にする。
証明書です:自己署名入りを選択します。
証明書です:
CAファイル:
root.pem
Let's Encryptの証明書から手動で作成したものです。証明書クライアントファイル:
client.crt
ローカルで以前opensslで作成したものです。クライアントキーファイルです:
client.key
はopensslで以前にローカルに作成されたものです。
接続が成功すると、緑色の「SSL」サインが表示され、双方向TLS/SSLが完全に設定され、使用できるようになります。トピックを購読し、同じトピックにメッセージを送信することで、さらにテストすることができます。
Error: unable to get issuer certificate」メッセージが表示された場合は、ISRG Root X1 Self-signed certificateをダウンロードし、MQTT Xの「CA file」フィールドに使用してください。このエラーは、Let's Encryptのデフォルトのルート証明書自体が、最近期限切れになった古いCAで認証されているため、一部のデバイスがそれを信頼しなくなったために発生します。詳しくはこちら.
次のステップ
これで、EMQX Cloud にLet's Encryptで認証されたRoute 53のカスタムドメインを使用し、MQTT Xでテストした場合の双方向TLS認証の設定が完了しました。双方向TLS/SSLはインターネット上の通信に重要なセキュリティ層を提供し、機密情報の保護や攻撃防止に役立ちます。
EMQX Cloudが提供するものを探求し続けます:
- Pythonを使用してEMQX Cloudに接続する.
- データ統合でデータを永続化し、他のサービスに接続する .
- EMQX の関数に REST API でアクセスする .
EMQX Cloudの詳細については、ドキュメント、GitHub、Slackチャンネル、およびフォーラムをご確認ください!質問、コメント、提案については、cloud-support@emqx.io までご連絡ください。