ESP8266HTTPClient SSL握手失败(SSL error 40)问题求助
排查ESP8266HTTPClient SSL握手失败问题
你遇到的SSL握手失败(错误代码40)是ESP8266做HTTPS请求时的典型问题,我帮你梳理几个最可能的原因和解决办法:
1. 指纹格式或值错误
你代码里的fingerPrint带了空格,这大概率是核心问题!ESP8266HTTPClient要求的SHA-1指纹是不带空格的十六进制字符串,可以是连续字符(如A1B2C3...)或冒号分隔(如A1:B2:C3:...),绝对不能包含空格。
正确获取指纹的步骤:
用Chrome/Firefox访问目标URL,点击地址栏的锁图标 → 查看证书 → 详细信息 → 找到「SHA-1指纹」,复制后去掉所有空格,比如把SO ME SH A1 FI NG ER PR IN T改成SOMESHA1FINGERPRINT或者SO:ME:SH:A1:FI:NG:ER:PR:IN:T(注意长度必须是40个字符,对应SHA-1的20字节)。
2. TLS版本不兼容
ESP8266默认的SSL库(BearSSL)可能和服务器的TLS版本不匹配,比如服务器禁用了TLS 1.0/1.1,只支持TLS 1.2。你可以手动指定TLS版本试试:
http.setTLSVersion(TLS_1_2); // 一定要在http.begin()之前调用
3. 证书链或服务器配置问题
- 如果你复制的是根证书的指纹,而非服务器的叶子证书指纹,也会导致验证失败。务必复制服务器本身的证书指纹,不要用根CA的。
- 检查服务器证书是否过期,或者是否更换了证书(证书更换后指纹也会同步变化)。
4. 网络或环境问题
- 确认ESP8266已经正常连接WiFi(你的代码里没写WiFi初始化逻辑,这是发起HTTP请求的必要前提!)。
- 检查所在网络是否允许访问443端口,有没有防火墙、代理拦截SSL连接。
- 可以尝试用目标服务器的IP地址代替URL,排查DNS解析是否出现问题。
修正后的完整示例代码:
#include <ESP8266HTTPClient.h> #include <ESP8266WiFi.h> const char* ssid = "你的WiFi名称"; const char* password = "你的WiFi密码"; const char* url = "https://someUrl.com"; // 替换为你获取到的正确SHA-1指纹 const char* fingerPrint = "A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0"; void setup() { Serial.begin(115200); // 先完成WiFi连接 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi已连接"); HTTPClient http; // 指定TLS 1.2版本,适配多数现代服务器 http.setTLSVersion(TLS_1_2); // 初始化HTTP客户端 if (http.begin(url, fingerPrint)) { int httpCode = http.GET(); if (httpCode > 0) { Serial.printf("HTTP状态码: %d\n", httpCode); String payload = http.getString(); Serial.println("响应内容:"); Serial.println(payload); } else { Serial.printf("GET请求失败,错误信息: %s\n", http.errorToString(httpCode).c_str()); } http.end(); // 务必释放HTTP客户端资源 } else { Serial.println("HTTP客户端初始化失败"); } } void loop() { // 按需添加循环执行的逻辑 }
建议先从修正指纹格式开始排查,这是触发该错误最常见的原因,要是还不行再依次检查TLS版本和网络环境。
内容的提问来源于stack exchange,提问作者Yannic Bürgmann
相关产品推荐
相关产品推荐

