C 无法使用mbedtls示例客户端连接到https服务器

C 无法使用mbedtls示例客户端连接到https服务器,c,stm32,mbedtls,C,Stm32,Mbedtls,编辑:我使用python SSL服务器在主板和计算机上使用静态IP进行了测试,测试结果与预期相符,这让我相信DHCP就是问题所在。如果有人对可能发生的事情有线索,我们将不胜感激 我正在STM32F746-NUCLEO板上使用mbedTLS库,我想将其用作SSL客户端和服务器。服务器运行良好,因此我尝试使用客户机示例代码(在单独的项目中) 以下mbedtls\u net\u connect调用返回-68(mbedtls\u ERR\u net\u connect\u失败)。深入挖掘发现这是由于路由

编辑:我使用python SSL服务器在主板和计算机上使用静态IP进行了测试,测试结果与预期相符,这让我相信DHCP就是问题所在。如果有人对可能发生的事情有线索,我们将不胜感激

我正在STM32F746-NUCLEO板上使用mbedTLS库,我想将其用作SSL客户端和服务器。服务器运行良好,因此我尝试使用客户机示例代码(在单独的项目中)

以下
mbedtls\u net\u connect
调用返回-68(mbedtls\u ERR\u net\u connect\u失败)。深入挖掘发现这是由于路由错误(LwIP中tcp.c中的第900行),因为local_ip设置为0。主板在连接到internet的家庭路由器上处于DHCP模式。目标服务器已启动并正在运行,
server\u 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;
    }
}
mbedtls\u熵\u上下文客户端\u熵;
静态mbedtls\u net\u上下文服务器\u fd;
mbedtls_x509_crt cacert;
静态uint32_t标志;
静态uint8_t vrfy_buf[512];
静态const uint8\u t*客户端\u pers=“ssl\u客户端”;
mbedtls\u ssl\u配置客户端\u配置;
mbedtls\u ctr\u drbg\u上下文客户端\u ctr\u drbg;
mbedtls\u ssl\u上下文客户端\u ssl;
静态uint8_t client_buf[1024];
无效SSL_服务器(无效常量*参数){
内特里特,莱恩;
未使用(参数);
mbedtls_net_init(&server_fd);
mbedtls_ssl_init(&client_ssl);
mbedtls\u ssl\u config\u init(&client\u config);
mbedtls_x509_crt_init(&cacert);
mbedtls中心drbg初始(和客户中心drbg);
//随机数发生器的种子设定
mbedtls_熵_init(&client_熵);
len=strlen((字符*)客户机);
如果((ret=mbedtls\u ctr\u drbg\u seed)和客户机\u ctr\u drbg,mbedtls\u熵函数,
&客户端信息熵,(常量无符号字符*)客户端信息熵(len))!=0)
{
转到出口;
}
//1.初始化证书
ret=mbedtls\U x509\U crt\U解析(&cacert,(常量无符号字符*)mbedtls\U测试\U cas\U pem,
mbedtls(测试和测试);
如果(ret<0)
{
转到出口;
}
如果((ret=mbedtls\u net\u connect)(&server\u fd、server\u名称、server\u端口、,
MBEDTLS(网络协议)(TCP))!=0)
{
mbedtls\u printf(“失败的\n!mbedtls\u网络\u连接返回%d\n\n”,ret);
转到出口;
}
}
这里,SSL_服务器函数是一个在
main()
中调用的FreeRTOS线程。我还可以确认网络接口在发生错误时已分配了IP地址。
我希望连接调用返回0并连接到服务器以启动SSL握手。

您需要为LWIP设置默认的netif路由,以便能够路由远程地址。 只需添加
netif\u set\u默认值(&netif)在函数
mbedtls\u net\u init()内的
dhcp\u start()
之后

void mbedtls\u net\u init(mbedtls\u net\u context*ctx){
...
/*添加网络接口*/
netif_-add(&netif,&addr,&netmask,&gw,NULL,ðernetif_-init,ðernet_-input);
/*注册默认网络接口*/
netif\u设置(&netif);
#ifdef使用DHCP
netif.ip_addr.addr=0;
dhcp_启动(&netif);
#恩迪夫

netif_set_default(&netif);//如果没有完整的代码,很难判断。也许您尝试在主板获得DHCP IP之前进行连接?代码是mbedtls中的客户端示例,我将编辑我的帖子以包含相关部分
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();
  }

  ...