Не удается подключиться к серверу https с помощью примера клиента mbedtls - PullRequest
2 голосов
/ 09 апреля 2019

РЕДАКТИРОВАТЬ : я протестировал статический IP-адрес на плате и на моем компьютере с сервером Python SSL, и он работает, как и ожидалось, что наводит меня на мысль, что проблема заключается в DHCP.Если кто-то знает, что может происходить, это будет с благодарностью.

Я использую библиотеку mbedTLS на плате STM32F746-NUCLEO и хочу использовать ее как клиент и сервер SSL.Сервер работает хорошо, поэтому я попытался использовать пример кода клиента (как есть, в отдельном проекте).

Следующий mbedtls_net_connect вызов возвращает -68 (MBEDTLS_ERR_NET_CONNECT_FAILED).Копание глубже показывает, что это происходит из-за ошибки маршрутизации (строка 900 в tcp.c от LwIP), потому что local_ip установлен в 0. Плата находится в режиме DHCP на домашнем маршрутизаторе, который подключен к Интернету.Сервер назначения запущен и работает, а SERVER_NAME - это IP-адрес в виде обычного текста.

mbedtls_entropy_context client_entropy;
static mbedtls_net_context server_fd;
mbedtls_x509_crt cacert;
static uint32_t flags;
static uint8_t vrfy_buf[512];
static const uint8_t* client_pers = "ssl_client";
mbedtls_ssl_config client_config;
mbedtls_ctr_drbg_context client_ctr_drbg;
mbedtls_ssl_context client_ssl;
static uint8_t client_buf[1024];

void SSL_Server(void const *argument) {
    int ret, len;
    UNUSED(argument);

    mbedtls_net_init(&server_fd);
    mbedtls_ssl_init(&client_ssl);
    mbedtls_ssl_config_init(&client_config);
    mbedtls_x509_crt_init(&cacert);
    mbedtls_ctr_drbg_init(&client_ctr_drbg);

    // Seeding the random number generator

    mbedtls_entropy_init( &client_entropy );
    len = strlen((char *) client_pers);
    if((ret = mbedtls_ctr_drbg_seed(&client_ctr_drbg, mbedtls_entropy_func,
            &client_entropy, (const unsigned char *) client_pers, len)) != 0)
    {
    goto exit;
    }


    // 1. Initialize certificates

    ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_cas_pem,
            mbedtls_test_cas_pem_len );

    if( ret < 0 )
    {
    goto exit;
    }


    if((ret = mbedtls_net_connect(&server_fd, SERVER_NAME, SERVER_PORT, 
          MBEDTLS_NET_PROTO_TCP)) != 0)
    {
        mbedtls_printf( " failed\n  ! mbedtls_net_connect returned %d\n\n", ret );
        goto exit;
    }
}

Здесь функция SSL_Server - это поток FreeRTOS, вызываемый в main().Я также могу подтвердить, что сетевому интерфейсу был назначен IP-адрес при возникновении ошибки.Я ожидаю, что вызов соединения вернет 0 и подключится к серверу для инициации рукопожатия SSL.

1 Ответ

2 голосов
/ 09 апреля 2019

Вам необходимо установить маршрут netif по умолчанию для LWIP, чтобы иметь возможность маршрутизировать удаленный адрес. Просто добавьте netif_set_default(&netif); после dhcp_start() внутри функции mbedtls_net_init().

void mbedtls_net_init( mbedtls_net_context *ctx ) {

  ...

  /* add the network interface */    
  netif_add(&netif, &addr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);

  /* register the default network interface */
  netif_set_up(&netif);

#ifdef USE_DHCP
  netif.ip_addr.addr = 0;
  dhcp_start(&netif);
#endif

  netif_set_default(&netif);  // <-- Here

  osDelay(500);

  start = HAL_GetTick();

  while((netif.ip_addr.addr == 0) && (HAL_GetTick() - start < 10000))
  {
  }

  if (netif.ip_addr.addr == 0) {
    printf(" Failed to get ip address! Please check your network configuration.\n");
    Error_Handler();
  }

  ...

Документация для MbedTLS может быть довольно сложной, надеюсь, это поможет.

...