Связь между ESP8266 и C # через SSL - PullRequest
0 голосов
/ 02 января 2019

Я купил 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);
    }
  }
}
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...