Skip to content

大佬,我想问一个关于嵌入式使用mbedtls调用deepseekAPI的问题 #7

@Mingheng-Zheng

Description

@Mingheng-Zheng

我下面的代码,一直显示SSL握手失败:返回值是7780,SSL - A fatal alert message was received from our peer,但是下面的证书验证显示flags=0x00000000,但是我尝试百度就可以,能不能指点一下为什么,万分感谢!
#include "stdio.h"
#include "mbedtls/build_info.h"
#include "mbedtls/platform.h"
#include "mbedtls/net_sockets.h"
#include "mbedtls/debug.h"
#include "mbedtls/ssl.h"
#include "mbedtls/entropy.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/error.h"
#include "deepseek.h"
#include "lwip/ip4_addr.h"
#include "lwip/netif.h"
#include "lwip/netifapi.h"
#include "lwip/sockets.h"
#include "lwip/netdb.h"
#include "../wifi/wifi_connect.h"
#include "cmsis_os2.h"
#include "app_init.h"
#include "soc_osal.h"
#include "mbedtls/mbedtls_config.h"
#include "watchdog.h"
#include "mbedtls/ssl.h"
#include <string.h>

// 确保所有依赖库已启用
#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_ENTROPY_C) ||
!defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_CLI_C) ||
!defined(MBEDTLS_NET_C) || !defined(MBEDTLS_RSA_C) ||
!defined(MBEDTLS_PEM_PARSE_C) || !defined(MBEDTLS_CTR_DRBG_C) ||
!defined(MBEDTLS_X509_CRT_PARSE_C)
#else

// 配置参数
#define DEEPSEEK_SERVER "api.deepseek.com"
#define TEST_SERVER "www.baidu.com"
#define DEEPSEEK_PORT "443"
#define API_KEY "Bearer sk-23fafdadc261486b99aec19629160043" // 你的API密钥
#define CONFIG_WIFI_SSID "zmh" // 要连接的WiFi热点账号
#define CONFIG_WIFI_PWD "88888888" // 要连接的WiFi热点密码
// 请求模板
static const char *request_template =
"POST /chat/completions HTTP/1.1\r\n"
"Host: " DEEPSEEK_SERVER "\r\n"
"Authorization: " API_KEY "\r\n"
"Content-Type: application/json\r\n"
"Content-Length: %d\r\n\r\n"
"%s";

// static const char *request =
// "GET / HTTP/1.1\r\n"
// "Host: " TEST_SERVER "\r\n"
// "Connection: close\r\n\r\n";

// JSON请求体模板
static const char *json_body_template =
"{"model": "deepseek-chat","
""messages": [{"role": "user", "content": "%s"}]}";

#define DEBUG_LEVEL 4
#define REQ_BUF_SIZE 2048
#define RESP_BUF_SIZE 4096

#include <sys/time.h>
#include <crypto_types.h>
#include <crypto_values.h>

void sync_time_manually(void) {
struct timeval tv;
// 设置为 2025-05-03 12:00:00
tv.tv_sec = 1746254400;
tv.tv_usec = 0;
settimeofday(&tv, NULL);
}

void print_current_time(void)
{
time_t now = time(NULL); // 当前 UNIX 时间戳(秒)
if (now == (time_t)-1) {
printf("time() failed!\r\n");
return;
}

/* 打印时间戳本身 */
printf("Unix time : %lld\r\n", (long long)now);

/* 打印可读格式(UTC) */
struct tm *tm_now = gmtime(&now); // 若想打印本地时区可用 localtime()
if (tm_now) {
printf("UTC time : %04d-%02d-%02d %02d:%02d:%02d\r\n",
tm_now->tm_year + 1900,
tm_now->tm_mon + 1,
tm_now->tm_mday,
tm_now->tm_hour,
tm_now->tm_min,
tm_now->tm_sec);
}
}

static int main(void)
{
osal_msleep(2000);
sync_time_manually();
wifi_connect(CONFIG_WIFI_SSID, CONFIG_WIFI_PWD);
int ret = 1;
size_t written = 0;
size_t len = 0;
char json_body[512];
mbedtls_net_context server_fd;
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_ssl_context ssl;
mbedtls_ssl_config conf;
mbedtls_x509_crt cacert;
const char *pers = "deepseek_client";
unsigned char req_buf[REQ_BUF_SIZE];
unsigned char resp_buf[RESP_BUF_SIZE];

// 初始化所有组件
mbedtls_net_init(&server_fd);
mbedtls_ssl_init(&ssl);
mbedtls_ssl_config_init(&conf);
mbedtls_x509_crt_init(&cacert);
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_entropy_init(&entropy);

// 1. 初始化随机数生成器
if ((ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
(const unsigned char *)pers,
sizeof(pers))) != 0) {
mbedtls_printf("DRBG初始化失败: -0x%x\n", -ret);

}

// 2. 加载CA证书(替换为你自己的证书)
if ((ret = mbedtls_x509_crt_parse(&cacert, (const unsigned char *)your_ca_cert,
sizeof(your_ca_cert))) != 0) {
mbedtls_printf("CA证书加载失败: -0x%x\n", -ret);
goto exit;
}

// 3. 建立TCP连接
if ((ret = mbedtls_net_connect(&server_fd, DEEPSEEK_SERVER,
DEEPSEEK_PORT, MBEDTLS_NET_PROTO_TCP)) != 0) {
mbedtls_printf("连接失败666: -0x%x\n", -ret);
goto exit;
}

// 4. 配置SSL
if ((ret = mbedtls_ssl_config_defaults(&conf,
MBEDTLS_SSL_IS_CLIENT,
MBEDTLS_SSL_TRANSPORT_STREAM,
MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {
mbedtls_printf("SSL1配置失败: -0x%x\n", -ret);
goto exit;
}

mbedtls_ssl_conf_min_version(&conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3); // TLS 1.2
mbedtls_ssl_conf_max_version(&conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);

mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);

if ((ret = mbedtls_ssl_setup(&ssl, &conf)) != 0) {
mbedtls_printf("SSL2初始化失败: -0x%x\n", -ret);
goto exit;
}

if ((ret = mbedtls_ssl_set_hostname(&ssl, DEEPSEEK_SERVER)) != 0) {
mbedtls_printf("设置主机名失败: -0x%x\n", -ret);
goto exit;
}

mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);

// 5. SSL握手
while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
char error_buf[256];
mbedtls_strerror(ret, error_buf, sizeof(error_buf));
mbedtls_printf("SSL3握手失败: %s\n", error_buf);
mbedtls_printf("SSL3握手失败: -0x%x\n", -ret);
print_current_time();
uint32_t flags = mbedtls_ssl_get_verify_result(&ssl);
mbedtls_printf("verify flags = 0x%08X\r\n", (unsigned)flags);
if (flags != 0) {
char vrfy_buf[512];
mbedtls_x509_crt_verify_info(vrfy_buf, sizeof(vrfy_buf), " ! ", flags);
mbedtls_printf("证书验证失败详情:\n%s\n", vrfy_buf);
}
goto exit;
}
}
uint32_t flag;
// 6. 验证证书
if ((flag = mbedtls_ssl_get_verify_result(&ssl))!= 0) {
mbedtls_printf("verify flags = 0x%08X\r\n", (unsigned)flag);
char vrfy_buf[512];
mbedtls_x509_crt_verify_info(vrfy_buf, sizeof(vrfy_buf), " ! ", flag);
mbedtls_printf("证书验证失败详情asd:\n%s\n", vrfy_buf);
goto exit;
}

// 7. 构造请求

snprintf(json_body, sizeof(json_body), json_body_template, "你好,请介绍一下你自己");

len = snprintf((char *)req_buf, sizeof(req_buf), request_template,
strlen(json_body), json_body);
// len = snprintf((char *)req_buf, sizeof(req_buf), "%s", request);
if (len < 0 || (size_t)len >= sizeof(req_buf)) {
mbedtls_printf("请求构造失败888\n");
goto exit;
}

// 8. 发送请求

while (written < len) {
ret = mbedtls_ssl_write(&ssl, req_buf + written, len - written);
if (ret < 0) {
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
mbedtls_printf("发送失败999: -0x%x\n", -ret);
goto exit;
}
continue;
}
written += ret;
}

// 9. 读取响应
do {
len = sizeof(resp_buf) - 1;
ret = mbedtls_ssl_read(&ssl, resp_buf, len);

if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE)
    continue;

if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY || ret == 0) {
    ret = 0;
    break;
}

if (ret < 0) {
    mbedtls_printf("读取错误1221: -0x%x\n", -ret);
    break;
}

resp_buf[ret] = '\0';
mbedtls_printf("响应内容9898:\n%s\n", resp_buf);

} while (1);

mbedtls_ssl_close_notify(&ssl);
exit:
mbedtls_net_free( &server_fd );
mbedtls_ssl_free( &ssl );
mbedtls_ssl_config_free( &conf );
mbedtls_ctr_drbg_free( &ctr_drbg );
mbedtls_entropy_free( &entropy );
mbedtls_x509_crt_free(&cacert);
return 0;
}

#define HTTPS_PRIORITY (osPriority_t)(24)
static void tcp_client_sample_entry(void)
{
osThreadAttr_t attr;
attr.name = "https_sample_task";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 0x8000;
attr.priority = HTTPS_PRIORITY;
if (osThreadNew((osThreadFunc_t)main, NULL, &attr) == NULL) {
osal_printk("Create tcp_client_get fail.\r\n");
}
osal_printk("Create tcp_client_get succ.\r\n");
}

app_run(tcp_client_sample_entry);
#endif

证书如下:
static const char your_ca_cert[] =
"-----BEGIN CERTIFICATE-----\n"
"MIIGATCCBOmgAwIBAgIQDURz1QlGWUOmSKKO3xeEvTANBgkqhkiG9w0BAQsFADBu\n"
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
"d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg\n"
"RFYgVExTIENBIC0gRzIwHhcNMjUwMTMwMDAwMDAwWhcNMjYwMTMwMjM1OTU5WjAZ\n"
"MRcwFQYDVQQDDA4qLmRlZXBzZWVrLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n"
"ADCCAQoCggEBAM+oD6z3mExjx8vr6PcEJ1uu7TlU5gEl+L1mQZT+WZuTGlg1WCge\n"
"WfQmR1NdVHASagnhzTxlmZsefoJw+qfGA2jFztu66YEvmoG+nt0zAjYj3HIJqzdq\n"
"q6VOGZNebZN2EedFxc/BMhff0ixWtgl5nvM3sRUCbtaAY/4l2q7Qm6I/Vs7M1wuO\n"
"NHiEabFaOOW+5GdL6wq8QfBFkBvKp8Pxt2nN22ZZjAZjHQbmw/8StzFO2mhef6S5\n"
"6snUfhxHkvlD3cQiwe4h8qJtCG+7XXT7DiJSVIyZ079D47fd+Neet0eC7NQ5UOhu\n"
"1OI+W/ZLS3/x0dWp/UAya2ZN0U+ypwHPwS8CAwEAAaOCAu4wggLqMB8GA1UdIwQY\n"
"MBaAFHjfkZBf7t6s9sV169VMVVPvJEq2MB0GA1UdDgQWBBTFJbPA0cNBLxEAsv4+\n"
"p/zuEgwAZzAnBgNVHREEIDAegg4qLmRlZXBzZWVrLmNvbYIMZGVlcHNlZWsuY29t\n"
"MD4GA1UdIAQ3MDUwMwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cu\n"
"ZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB\n"
"BQUHAwEGCCsGAQUFBwMCMIGABggrBgEFBQcBAQR0MHIwJAYIKwYBBQUHMAGGGGh0\n"
"dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2Vy\n"
"dHMuZGlnaWNlcnQuY29tL0VuY3J5cHRpb25FdmVyeXdoZXJlRFZUTFNDQS1HMi5j\n"
"cnQwDAYDVR0TAQH/BAIwADCCAX0GCisGAQQB1nkCBAIEggFtBIIBaQFnAHUADleU\n"
"vPOuqT4zGyyZB7P3kN+bwj1xMiXdIaklrGHFTiEAAAGUtTTHbgAABAMARjBEAiAc\n"
"KNQ5E0kKkennGrGjF8a1SwSI2lk3rSzxrDcwlhZXOQIga1ZU4ilhT4XQImt0e/in\n"
"+J9krzCTyabvaIRJfNnCfX8AdQBkEcRspBLsp4kcogIuALyrTygH1B41J6vq/tUD\n"
"yX3N8AAAAZS1NMdmAAAEAwBGMEQCIEAlmoc9JFTOBuwin9v/kjB6Pu5OhH6ZDUu6\n"
"5rilNjl8AiBA0dF7rg5Tt5bNbKAs59XAGcGiQskg84BhgRoL46GF8gB3AEmcm2ne\n"
"HXzs/DbezYdkprhbrwqHgBnRVVL76esp3fjDAAABlLU0x3oAAAQDAEgwRgIhAJQm\n"
"WsTmwCYfBRtGal+3uaiH5NaAl3PuSFofV5vaesbFAiEAn8scDo0tOBx9G++kxgCx\n"
"0P6CT4imRUHMwqH3BKi+jFgwDQYJKoZIhvcNAQELBQADggEBAFwP/+4ID1RbSoHR\n"
"ypa8At3IzjaC5/4Bd42x/mYv3j6nvYR2lJst1OUCvV5vJ9N8my0T15Q/aEq0VQmw\n"
"H0M+YpRXeyYRhnkzLknTvTmGk1NhfG0CEDYKA3zpjRBL7Hcx/Y227Rq+Pdle4GXO\n"
"MZYTiJ4SC9Fz/tKGKwvzgXoSWVnayrhKGlMadM1fJtRaEDG9SbOjyOnkZkKIJpbU\n"
"hQbus4lCGFeUvqpPvT4Mt/YrEBuhxB7YR6rkEV0KDe7i2veTNGY+bv+e94H6LdFF\n"
"tM2BdzTnCPU+/2/41NcO4r0qRqqgV7Yxm/Alq6my/TMi1FeLUd8OGT+d0ZEIvmkI\n"
"HYeCBlM=\n"
"-----END CERTIFICATE-----\n"
"-----BEGIN CERTIFICATE-----\n"
"MIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh\n"
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
"MjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT\n"
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
"b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH\n"
"MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE\n"
"eSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv\n"
"NhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch\n"
"QisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn\n"
"NYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP\n"
"ha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI\n"
"lfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf\n"
"BgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw\n"
"HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C\n"
"AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp\n"
"Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu\n"
"Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG\n"
"/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT\n"
"MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ\n"
"L0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi\n"
"98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe\n"
"xNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN\n"
"GfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2\n"
"n2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg==\n"
"-----END CERTIFICATE-----\n"
"-----BEGIN CERTIFICATE-----\n"
"MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\n"
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
"MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\n"
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\n"
"9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\n"
"2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\n"
"1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\n"
"q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\n"
"tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\n"
"vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\n"
"BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\n"
"5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\n"
"1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\n"
"NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\n"
"Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\n"
"8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\n"
"pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\n"
"MrY=\n"
"-----END CERTIFICATE-----\n";

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions