Я купил ESP8266 для проекта домашней автоматизации. Я использую BearSSL на ESP8266 с сертификатом и ключом, которые я сгенерировал с помощью этого скрипта https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/WiFiHTTPSServer/make-self-signed-cert.sh. ESP8266 действует как сервер и подключен к WiFi. В приложении C # я использую SslStream для подключения к ESP8266, но каждый раз, когда я пытаюсь выполнить аутентификацию на сервере, возникает ошибка: «System.Net.InternalException».
Я часами просматривал Интернет и пробовал разные коды, но все еще не могу понять, как решить эту проблему. Можете ли вы помочь мне?
C # код:
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
namespace Esp8266_test
{
class Program
{
static void Main(string[] args)
{
string ip = "192.168.1.118";
int port = 443;
TcpClient client = new TcpClient(ip, port);
//using (SslStream ssl = new SslStream(client.GetStream(), false,
new RemoteCertificateValidationCallback(ValidateServerCertificate), null))
using (var ssl = new SslStream(client.GetStream(), false, App_CertificateValidation))
{
ssl.AuthenticateAsClient(ip);
string text = "turnOnLed";
char[] message = new char[text.Length + 1];
for (int i = 0; i < text.Length; i++)
{
message[i] = text[i];
if (i == text.Length - 1)
{
message[i + 1] = '\n';
}
}
byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
ssl.Write(data, 0, data.Length);
}
}
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
public static bool App_CertificateValidation(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None) { return true; }
if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors) { return true; } //we don't have a proper certificate tree
return false;
}
}
}
Код Arduino:
#include <ESP8266WiFi.h>
WiFiServerSecure server(443);
static const uint8_t rsakey[] PROGMEM =
{
#include <key.h>
};
static const uint8_t x509[] PROGMEM =
{
#include <x509.h>
};
void setup() {
Serial.begin(115200);
WiFi.begin("ssid", "******");
Serial.print("Connecting");
pinMode(LED_BUILTIN, OUTPUT);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(100);
}
Serial.println();
Serial.println("Connected");
Serial.println(WiFi.localIP());
digitalWrite(LED_BUILTIN, HIGH);
server.setServerKeyAndCert_P(rsakey, sizeof(rsakey), x509, sizeof(x509));
server.begin();
}
void loop() {
WiFiClientSecure client = server.available();
while (client.connected())
{
if (client.available())
{
String text = client.readStringUntil('\n');
if(text == "turnOnLed")
{
digitalWrite(LED_BUILTIN, LOW);
}
else if(text == "turnOffLed")
{
digitalWrite(LED_BUILTIN, HIGH);
}
}
}
}