我使用提供的证书运行了 Espressif HTTPS 服务器示例。我能够成功连接到服务器并接受浏览器中的警告(如预期)。
然后,按照我在
certs
文件夹中发布的上述自述文件中包含的说明进行操作:
openssl req -newkey rsa:2048 -nodes -keyout prvtkey.pem -x509 -days 3650 -out cacert.pem -subj "/CN=My own certificate"
并将新固件上传到ESP32。 现在,我无法再连接了。火狐浏览器 说:
SEC_ERROR_BAD_SIGNATURE
Chrome 说:
ERR_SSL_PROTOCOL_ERROR
在服务器端我收到以下消息:
E (1059558) esp-tls-mbedtls: mbedtls_ssl_handshake returned -0x7780
E (1059558) esp_https_server: esp_tls_create_server_session failed
E (1059558) httpd: httpd_accept_conn: session creation failed
W (1059568) httpd: httpd_server: error accepting new connection
我 RFTM 并遵循他们的指示。什么可能阻止与我使用
openssl
生成的证书创建安全连接?
两个证书(我的和 Expressif 提供的证书)的长度和标头相同。
在阅读了用户总裁 James K. Polk 的评论后,我深入了解了
openssl
生成的文件,发现 Expressif 的官方文档是错误。
自述文件报告:
openssl req -newkey rsa:2048 -nodes -keyout prvtkey.pem -x509 -days 3650 -out cacert.pem -subj "/CN=ESP32 HTTPS server example"
但是项目的CMakeLists.txt包含:
idf_component_register(SRCS "main.c"
INCLUDE_DIRS "."
EMBED_TXTFILES "certs/servercert.pem"
"certs/prvtkey.pem")
事实上,cert目录也包含这些文件。 因此
openssl
创建了 cacert.pem
而不是 servercert.pem
。
发出的正确命令是:
openssl req -newkey rsa:2048 -nodes -keyout prvtkey.pem -x509 -days 3650 -out servercert.pem -subj "/CN=ESP32 HTTPS server example"
这会导致预期的行为。