MIMXRT1180-EVK の MQTT を使用した TLS のリクエストの例Hi,
私は現在、MIMXRT1180-EVKを使用しており、LwIPおよびmbedTLSスタックを使用してベアメタル環境でMQTT over TLSを実装する必要があります。基本的なMQTT機能を実装しましたが、TLSの部分については、SDKがTLS統合を使用したMQTTに特化した例を提供していないことに気付きました。
安全なMQTT通信のためにTLSを構成および統合する方法を示すガイダンスまたはサンプルプロジェクトを探しています。これに役立つアドバイス、出発点、または参照があれば、それは大歓迎です。
よろしくお願いいたします!
よろしくお願いいたします
パヴァン・クマール・S.
Re: MIMXRT1180-EVKのMQTTを使用したTLSのリクエストの例Hi @PavanKumarS
mbedTLS を使用して CA 証明書と秘密キーを解析しているときに発生するエラーは、証明書とキーを解析関数に提供する方法に潜在的な書式設定またはメモリの問題があることを示唆しています。
BR
ハリー
Re: MIMXRT1180-EVKのMQTTを使用したTLSのリクエストの例こんにちは@Harry_Zhang、
mbedTLSを使用してMQTT経由でTLSを設定する際に問題に直面しています。具体的には、CA 証明書とクライアントの秘密キーを解析しようとすると、次のエラー コードが表示されます。
1. mbedtls_x509_crt_parse返されました -0x2880
2. mbedtls_pk_parse_key 返品 -15616
解析に使用しているコードは次のとおりです。
ret = mbedtls_x509_crt_parse(&cacert, (const unsigned char *)mbedtls_mosquitto_ca_crt, mbedtls_mosquitto_ca_crt_len);
if(ret != 0) {
PRINTF( " が失敗しました\n !mbedtls_x509_crt_parse が -0x%x\n\n", -ret );
-1 を返します。
}
ret = mbedtls_pk_parse_key(&client_private_key, (const unsigned char *)client_key, client_key_len, NULL, 0);
if (ret != 0) {
PRINTF(" 失敗しました\r\n !mbedtls_pk_parse_key %d\r\n\r\n", ret);
-1 を返します。
}
CA 証明書:
定数 char mbedtls_mosquitto_ca_crt[] =
"-----証明書の開始-----\n"
"MIIEAzCCAuugAwIBAgIUBY1hlCGvdj4NhBXkZ/uLUZNILAwwDQYJKoZIhvcNAQEL\n"
"BQAwgZAxCzAJBgNVBAYTAkdCMRcwFQYDVQQIDA5Vbml0ZWQgS2luZ2RvbTEOMAwG\n"
"A1UEBwwFRGVyYnkxEjAQBgNVBAoMCU1vc3F1aXR0bzELMAkGA1UECwwCQ0ExFjAU\n"
"BgNVBAMMDW1vc3F1aXR0by5vcmcxHzAdBgkqhkiG9w0BCQEWEHJvZ2VyQGF0Y2hv\n"
"by5vcmcwHhcNMjAwNjA5MTEwNjM5WhcNMzAwNjA3MTEwNjM5WjCBkDELMAkGA1UE\n"
「BhMCR0IxFzAVBgNVBAgMDlVuaXRlZCBLaW5nZG9tMQ4wDAYDVQQHDAVEZXJieTES\n」
"MBAGA1UECgwJTW9zcXVpdHRvMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNbW9zcXVp\n"
"dHRvLm9yZzEfMB0GCSqGSIb3DQEJARYQcm9nZXJAYXRjaG9vLm9yZzCCASIwDQYJ\n"
「KoZIhvcNAQEBBQADggEPADCCAQoCggEBAME0HKmIzfTOwkKLT3THHe+ObdizamPg\n」
「UZmD64Tf3zJdNeYGYn4CEXbyP6fy3tWc8S2boW6dzrH8SdFf9uo320GJA9B7U1FW\n」
「Te3xda/Lm3JFfaHjkWw7jBwcauQZjpGINHapHRlpiCZsquAthOgxW9SgDgYlGzEA\n」
「s06pkEFiMw+qDfLo/sxFKB6vQlFekMeCymjLCbNwPJyqyhFmPWwio/PDMruBTzPH\n」
「3cioBnrJWKXc3OjXdLGFJOfj7pP0j/dr2LH72eSvv3PQQFl90CZPFhrCUcRHSSxo\n」
"E6yjGOdnz7f6PveLIB574kQORwt8ePn0yidrTC1ictikED3nHYhMUOUCAwEAAaNT\n"
"MFEwHQYDVR0OBBYEFPVV6xBUFPiGKDyo5V3+Hbh4N9YSMB8GA1UdIwQYMBaAFPVV\n"
「6xBUFPiGKDyo5V3+」Hbh4N9YSMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL\n"
「BQADggEBAGa9kS21N70ThM6/Hj9D7mbVxKLBjVWe2TPsGfbl3rEDfZ+OKRZ2j6AC\n」
「6r7jb4TZO3dzF2p6dgbrlU71Y/4K0TdzIjRj3cQ3KSm41JvUQ0hZ/c04iGDg/xWf\n」
"+pp58nfPAYwuerruPNWmlStWAXf0UTqRtg4hQDWBuUFDJTuWuuBvEXudz74eh/wK\n"
「sMwfu1HFvjy5Z0iMDU8PUDepjVolOCue9ashlS4EB5IECdSR2TItnAIiIwimx839\n」
「LdUdRudafMu5T5Xma182OC0/u/xRlEm+tvKGGmfFcN0piqVl8OrSPBgIlb+1IKJE\n」
"m/XriWr/Cq4h/JfB7NTsezVslgkBaoU=\n"
"-----証明書終了-----\n"
;
定数 size_t mbedtls_mosquitto_ca_crt_len = sizeof(mbedtls_mosquitto_ca_crt);
クライアントキー:
定数 char client_key[] =
"-----秘密キーの開始-----\n"
"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC2k9rQiTccnvdb\n"
"BblOq+eVjpF6B6SNixLtqUn5JdvA+oQOfDntxn/VRp6iPocnQPzPPcea02D7bo4y\n"
「xk8JeLphNxsVekf7/In9+IKBOZjfEbR8+PMs85yVBZuimgNiBQTLqHZICM4duYpS\n」
「M7NzJo4t8jtaacXTiirZOueL6fMXhZ9JahZRIBskVvgNP53RF5PrvATHtOMFSkGW\n」
"KpoGTXH04a2PBRzkw+6OaQGil/iWHnMYZp5xv8VOEcvSYSZeQPcbTnbJA08OS/nq\n"
「P2dWLlvtf7q34Bs1B0HuJu270MxLdiew/GvhrIMM/FNavRoRJwX72herao0c8hTV\n」
"ao4ez8P7AgMBAAECggEAWw1OjTw5B2WBz1uB6CmT40KH63cfSdWHOY35Da8jMlDd\n"
"BcpPK3UYcFj5KMmNJnbi/Ul+n4h2L74ZXVoHtZ4HOQ89yw7CEnmFqepCz0ZVpj2S\n"
"qNaQk6TkPG9hCAzNzhbZpuVbI558iFdtE4SkJDOgqWpJzlO8rDwWFWKqcdzY9iu9\n"
"nJSVAhS8LSVDhZgDCrj1FAeDDKeWU8AUFxDPRA6St8f5dV/S7+VB72UV/G0MqNQJ\n"
"ay6jWbnNbF21zr9hBsd4s2qrca+ps2p67BVFJHDGv/+7kEHAe2He3YRGYmYxShfh\n"
"+CewG9Dne65BOafkNDXhi2SvWWhDHGD69XHI4np3GQKBgQDpM6YW0o0hA/D6YqLV\n"
"/yj9DrGUMRYug7wXcL1KDzbzEl9MOwMoGZR+N0B1elXTkUmTv9C09231R1L1sT5V\n"
"iJ9msLd/7uuOMQYsyfaYHj7u4kCJTMNvfgB3xiQKK/NdsFOibJnNB9+qadFrqiSe\n"
「oHycTZPPaNFnRiTRjkJTQtA0AwKBgQDIbTtaHBF2HHyHNbKH6EVWh5jaciteZwnZ\n」
"HaVgUCWcUDptWT7ZXqRk40sEJnLhBS+20mU2Q0gsXV3AsRF11Dyl1fQZnVRtJNiw\n"
"azTinVGEayCGDABAefbGFo0U/SVrwK32MdwTgM0RL1P0+owRhoqvOaLS3ep1exiK\n"
「TDERCNx6qQKBgAgLnR5Kc04BSc4Jmx6Q6AQa/qtjKiW+q72PSSiF79pg9uK1Yn1+\n」
"rG3SUCn9Z3qeF5C+XF/x7Vw58rXBQKpIxV8Ql7QVNRE5xcHD0fsbiAZLzfguqsts\n"
「6G05a8LiE0pXK/t9jazSKbhCYFQ7kXnbhZEK6B+OuTK768dDBizDMFWrAoGBAMJm\n」
「IGFARDd5XdePX8Cuq0JIdxu6DRKdglHSjWsjkbdRoboaC/mt8GnihApceKSE8Ui0\n」
"PXMqQ0C0tpCFrlfJKaH4KbEGhrLuQDatZThAOqbjeUJLNZtUMOTlTqYC+17OHm1i\n"
「4wEPttdqPlapBV6iTrWyg5lfoV+dq6nISPcqzx8xAoGARi293eubEGy3zIixmVPH\n」
「XazH4Dlva236fXWbaRhkM916INKE2Y7BJveAb9epOes6+9Lcr/DjgsVc/4mDXvcK\n」
「U083ykGOi7CGbTREJC3uJL8zP3scc8wHfNh9F2nPpdgp5XeM/zsz3h7WizoSQrYM\n」
"U1o8oBFZC/M3NbfHH4RNJfw=\n"
"-----エンド秘密鍵-----\n&引用;
;
定数 size_t client_key_len = sizeof(client_key);
構成に何かが欠けていますか?
Re: MIMXRT1180-EVKのMQTTを使用したTLSのリクエストの例Hi @PavanKumarS
1.lwip_httpssrv_mbedTLS_bm_cm33例をインポートできます。

495行目の前、
LwIP ネットワーク スタックを構成して初期化します。
安全な通信のためにmbedTLSを設定します。
次に、2つのステップを完了するだけです
セキュアなTCP接続を確立する
1. 生のTCP接続を作成します。
LwIP を使用して、ポート 8883 (標準 MQTT over TLS ポート) でブローカーに接続します。
構造体 tcp_pcb *tcp_conn = tcp_new();
tcp_connect(tcp_conn, &broker_ip, MQTT_TLS_PORT, tcp_connected_callback);
2. TCP接続をTLSでラップします。
mbedtls_ssl_set_bio を使用して、LwIP ソケットを mbedTLS コンテキストにバインドします。
mbedtls_ssl_set_bio(&ssl, tcp_conn, mbedtls_net_send, mbedtls_net_recv, NULL);
3. TLSハンドシェイクを実行します。
int ret = mbedtls_ssl_handshake(&ssl);
if (ret != 0) {
printf("TLS ハンドシェイクに失敗しました: -0x%x\n", -ret);
ハンドル エラー
}
MQTT と TLS の統合
1. MQTT クライアントの初期化を変更します。
• mbedTLS ssl コンテキストを MQTT クライアントに渡します。
• 生の TCP 読み取り/書き込み呼び出しを mbedtls_ssl_read と mbedtls_ssl_write に置き換えます。
2. 公開と購読:
• MQTT パブリッシュ/サブスクライブ呼び出しが TLS レイヤー経由でルーティングされるようにします。
3. ブローカーの切断を処理します。
• TLS および MQTT 再接続のエラー処理を実装します。
BR
ハリー
Re: MIMXRT1180-EVKのMQTTを使用したTLSのリクエストの例こんにちはハリー、
MQTTクライアントコードに具体的にどのような変更を加える必要があるのか、また、どのような関数を変更または追加する必要があるのか、明確にしていただけますか?Re: MIMXRT1180-EVKのMQTTを使用したTLSのリクエストの例Hi @PavanKumarS
MQTT over TLS を使用して安全に通信するには、次のことを行う必要があります。
1. LwIPネットワークスタックを設定および初期化します。
2. 安全な通信のためにmbedTLSを設定します。
3. 既存の MQTT クライアント・コードを変更して、セキュアな接続を確立するために mbedTLS を使用します。
ですから、lwip_httpssrv_mbedTLS_bm_cm33例を参考にできると思います。

この例にはステップ 1 とステップ 2 が含まれており、既存の MQTT クライアントコードを変更するだけで済みます。
BR
ハリー