代码之家  ›  专栏  ›  技术社区  ›  Yannic Bürgmann

Arduino ESP8266HTTPClient:握手失败(SSL错误40)

  •  0
  • Yannic Bürgmann  · 技术社区  · 8 年前

    我面临着ESP8266HTTPClient和SSL的问题。

    #include <ESP8266HTTPClient.h>
    
    const char* url= "https://someUrl.com";
    const char* fingerPrint= "SO ME SH A1 FI NG ER PR IN T";
    
    HTTPClient http;
    http.begin(url, fingerPrint);
    http.GET();
    

    执行此操作时,我在调试日志中收到以下内容:

    State: sending Client Hello (1) Alert: handshake failure Error: SSL error 40 Alert: unexpected message Error: SSL error 40 Alert: close notify [HTTP-Client] failed connect to someUrl.com:443

    我试着检查指纹 grc 并得到以下回应:

    从远程服务器获取的SSL/TLS安全证书无效。问题严重到我们无法获取证书的通用名称和/或指纹。与您提供的域名(如上所示)关联的IP地址的HTTPS端口443上有一个服务器应答。但服务器可能会像回答HTTP一样回答HTTPS,并返回网页,而不是正确的SSL/TLS设置握手。(我们遇到了这种行为。)

    这让我相信主机上的SSL配置有问题。 但使用我的浏览器访问url时,证书没有问题(尝试过IE、Edge和FireFox)。

    根据 this comment to an issue on github 只有两个受支持的密码套件:

    • TLS\U RSA\U WITH\u AES\u 128\u CBC\u SHA和
    • TLS\U RSA\U WITH\u AES\u 256\u CBC\u SHA

    主机支持以下密码套件:

    • TLS\u ECDHE\u RSA\u WITH\u AES\u 128\u GCM\u SHA256
    • TLS\u ECDHE\u RSA\u WITH\u AES\u 256\u GCM\u SHA384

    是否有机会在ESP8266上对此主机执行HTTPS请求?也许是另一个HttpClient库?

    2 回复  |  直到 8 年前
        1
  •  0
  •   Dawn Minion    8 年前

    不幸的是,Arduino ESP8266并没有使用,因为无论您使用什么HTTP客户端库,它都使用axTLS。他们根本不支持它。

    然而,不久前,Espressif的SDK切换到了mbedTLS mbedTLS Supported Cipher Suites 显示它包括对这些密码的支持。然而,使用Arduino SDK编写的代码在很大程度上与Espressif SDK不兼容。

        2
  •  0
  •   Ethan Arnold    8 年前

    根据 https://github.com/esp8266/Arduino/issues/2771 Arduino ESP8266库现在被切换到BearSSL,据称它支持更多的密码。不幸的是,我的知识不足以(现在已经尝试了2天)实施修复,因为我也有同样的问题(需要登录以捕获SSL上的门户以进行wifi访问),但希望我很快就会发现。