ESP32 MQTT over TLS 1.3 not working
Posted: Sat Apr 02, 2022 3:10 pm
Hi,
anyone tried new TLS 1.3 feature?
I upgraded esp-idf to 5.0 and mbedtls in component to the branch mbedtls-3.1.0-idf
After the TLS handshake is over, the client receives "MBEDTLS_SSL_HS_NEW_SESSION_TICKET" packet.
And then post_handshake function directly returns with "UNEXPECTED_MESSAGE".
TLS connection is then break up.
in source code:
my debug log:
anyone tried new TLS 1.3 feature?
I upgraded esp-idf to 5.0 and mbedtls in component to the branch mbedtls-3.1.0-idf
After the TLS handshake is over, the client receives "MBEDTLS_SSL_HS_NEW_SESSION_TICKET" packet.
And then post_handshake function directly returns with "UNEXPECTED_MESSAGE".
TLS connection is then break up.
in source code:
Code: Select all
static int ssl_handle_hs_message_post_handshake( mbedtls_ssl_context *ssl )
{
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
/*
* - For client-side, expect SERVER_HELLO_REQUEST.
* - For server-side, expect CLIENT_HELLO.
* - Fail (TLS) or silently drop record (DTLS) in other cases.
*/
#if defined(MBEDTLS_SSL_CLI_C)
if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
( ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST ||
ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ) )
{
MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
/* With DTLS, drop the packet (probably from last handshake) */
#if defined(MBEDTLS_SSL_PROTO_DTLS)
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
{
return( 0 );
}
#endif
MBEDTLS_SSL_DEBUG_MSG( 1, ("my debug msg: post ssl handshake '%d'", ssl->in_msg[0]));
return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
}
#endif /* MBEDTLS_SSL_CLI_C */
Code: Select all
I (3606) mbedtls: ssl_tls13_client.c:1723 tls13 client state: MBEDTLS_SSL_HANDSHAKE_WRAPUP(15)
W (3616) mbedtls: ssl_tls13_client.c:1705 Switch to application keys for inbound traffic
W (3626) mbedtls: ssl_tls13_client.c:1708 Switch to application keys for outbound traffic
I (3636) mbedtls: ssl_tls.c:5323 <= handshake
I (3646) mbedtls: ssl_msg.c:5348 => write
I (3646) mbedtls: ssl_msg.c:2369 => write record
I (3656) mbedtls: ssl_msg.c:546 => encrypt buf
I (3656) mbedtls: ssl_msg.c:990 <= encrypt buf
I (3666) mbedtls: ssl_msg.c:1789 => flush output
I (3666) mbedtls: ssl_msg.c:1809 message length: 53, out_left: 53
I (3676) mbedtls: ssl_msg.c:1814 ssl->f_send() returned 53 (-0xffffffcb)
I (3686) mbedtls: ssl_msg.c:1842 <= flush output
I (3686) mbedtls: ssl_msg.c:2514 <= write record
I (3696) mbedtls: ssl_msg.c:5372 <= write
I (3696) mbedtls: ssl_msg.c:5067 => read
I (3706) mbedtls: ssl_msg.c:3546 => read record
I (3706) mbedtls: ssl_msg.c:1573 => fetch input
I (3716) mbedtls: ssl_msg.c:1730 in_left: 0, nb_want: 5
I (3716) mbedtls: ssl_msg.c:1755 in_left: 0, nb_want: 5
I (3726) mbedtls: ssl_msg.c:1756 ssl->f_recv(_timeout)() returned 5 (-0xfffffffb)
I (3736) mbedtls: ssl_msg.c:1776 <= fetch input
I (3736) mbedtls: ssl_msg.c:1573 => fetch input
I (3746) mbedtls: ssl_msg.c:1730 in_left: 5, nb_want: 255
I (3756) mbedtls: ssl_msg.c:1755 in_left: 5, nb_want: 255
I (3756) mbedtls: ssl_msg.c:1756 ssl->f_recv(_timeout)() returned 250 (-0xffffff06)
I (3766) mbedtls: ssl_msg.c:1776 <= fetch input
I (3776) mbedtls: ssl_msg.c:1014 => decrypt buf
I (3776) mbedtls: ssl_msg.c:1539 <= decrypt buf
I (3786) mbedtls: ssl_msg.c:3620 <= read record
W (3786) mbedtls: ssl_msg.c:4967 handshake received (not HelloRequest)
W (3796) mbedtls: ssl_msg.c:4976 my debug msg: post ssl handshake '4'