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

时间:2018-04-17 12:47:58

标签: c++ ssl arduino esp8266 arduino-esp8266

我遇到了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安全证书无效。麻烦严重到我们无法获得证书的通用名称和/或指纹。在HTTPS端口443上有一个服务器应答与您提供的域名相关联的IP地址(如上所示)。但是服务器可能正在回答HTTPS,就好像它是HTTP并返回网页而不是正确的SSL / TLS设置握手。 (我们遇到过这种行为。)

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

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

  • TLS_RSA_WITH_AES_128_CBC_SHA和
  • TLS_RSA_WITH_AES_256_CBC_SHA

主机支持以下密码套件:

  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

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

2 个答案:

答案 0 :(得分:0)

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

然而,Espressif的SDK在一段时间后切换到mbedTLS,mbedTLS Supported Cipher Suites表明它包含对这些密码的支持。但是,使用Arduino SDK制作的代码与Espressif SDK在很大程度上是不兼容的。

答案 1 :(得分:0)

根据https://github.com/esp8266/Arduino/issues/2771,现在将Arduino ESP8266库切换为BearSSL,据说该库支持更多密码。不幸的是,由于我有同样的问题(需要登录才能捕获SSL上的门户以进行wifi访问),因此我的知识不足(现在尝试2天)来实施此修复程序,但希望我很快能找到答案。