乐鑫技术交流
直播中

王静

7年用户 1558经验值
私信 关注
[问答]

mqtt ssl双向认证例程报-0x2700错误怎么解决?

版本idf-3.2,example/protocols/mqtt/ssl_mutual_aut例程,客户端认证正常,加人服务器认证后报-0x2700错误。
错误信息:
E (1193558) esp-tls: mbedtls_ssl_handshake returned -0x2700
I (1193558) esp-tls: Failed to verify peer certificate!
I (1193558) esp-tls: verification info:   ! The certificate is signed with an unacceptable key (eg bad curve, RSA too short).

E (1193578) esp-tls: Failed to open new connection
E (1193578) TRANS_SSL: Failed to open a new connection
E (1193588) MQTT_CLIENT: Error transport connect

证书定义:
extern const uint8_t client_cert_pem_start[] asm("_binary_client_crt_start");
extern const uint8_t client_cert_pem_end[] asm("_binary_client_crt_end");
extern const uint8_t client_key_pem_start[] asm("_binary_client_key_start");
extern const uint8_t client_key_pem_end[] asm("_binary_client_key_end");
extern const uint8_t server_cert_pem_start[] asm("_binary_mosquitto_org_crt_start");
extern const uint8_t server_cert_pem_end[] asm("_binary_mosquitto_org_crt_end")
mqtt配置:
    const esp_mqtt_client_config_t mqtt_cfg = {
        .uri = "mqtts://test.mosquitto.org:8884",
        .event_handle = mqtt_event_handler,
        .cert_pem = (const char *)server_cert_pem_start,
        .client_cert_pem = (const char *)client_cert_pem_start,
        .client_key_pem = (const char *)client_key_pem_start,
    };


回帖(1)

lalajie

2024-6-25 17:05:49
根据您提供的错误信息,问题出在 SSL/TLS 握手过程中,客户端无法验证服务器的证书。错误代码 -0x2700 表示证书验证失败。具体来说,错误信息指出证书是用不可接受的密钥签名的,例如曲线不正确或 RSA 密钥太短。

要解决这个问题,请按照以下步骤操作:

1. 检查服务器证书:首先,确保服务器证书是有效的,并且使用正确的密钥类型和长度。您可以使用 OpenSSL 命令行工具来检查证书的详细信息:

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

2. 确保证书链完整:确保服务器证书与其 CA 证书链正确链接。您可以使用以下命令查看证书链:

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

3. 更新 ESP-IDF 和 MbedTLS:确保您使用的 ESP-IDF 和 MbedTLS 版本是最新的,以避免已知的 bug 或兼容性问题。

4. 配置 ESP-TLS:在您的 MQTT 客户端示例代码中,确保正确配置了 ESP-TLS。例如,使用以下代码初始化 ESP-TLS 连接:

```c
esp_tls_cfg_t cfg = {
    .cacert_pem_buf = (const unsigned char *)cacert_pem_start,
    .cacert_pem_bytes = sizeof(cacert_pem_start),
    .clientcert_pem_buf = (const unsigned char *)client_pem_start,
    .clientcert_pem_bytes = sizeof(client_pem_start),
    .clientkey_pem_buf = (const unsigned char *)client_pem_start,
    .clientkey_pem_bytes = sizeof(client_pem_start),
    .skip_cert_common_name_check = false
};
```

5. 重新编译和测试:在完成上述步骤后,重新编译您的示例代码,并测试 MQTT 客户端是否可以成功连接到服务器。

如果问题仍然存在,请提供更多关于您的设置和配置的详细信息,以便进一步分析和解决问题。
举报
×
20
完善资料,
赚取积分