位置导航: ESP8266库 / WiFiServerSecure库 / 本页
说明
通过WiFiServerSecure语句,我们可以建立WiFiServerSecure对象从而使用ESP8266建立支持HTTPS协议的物联网服务器。
语法
server.setRSACert(cert, privateKey)
参数
– cert: 服务器证书
– privateKey:服务器私钥
返回值
无
示例程序
为了演示本实例程序的运行结果,我在这里使用基于Chrome内核的Microsoft Edge浏览器来进行示例程序操作演示。
请务必注意:本示例程序所使用的证书和密钥只能用于测试使用。您在自己搭建ESP8266物联网项目时,需要自行建立 证书密钥而不要使用本示例中的证书和密钥。
当您将以下示例程序中的WiFi连接信息修改并且将本示例程序上传ESP8266开发板后,开发板随即会自动连接WiFi。WiFi连接成功后,您将可以从串口监视器获取当前ESP8266开发板的IP地址。此时,ESP8266已经成功建立了支持HTTPS协议的网络服务器。您可以通过ESP8266的IP地址来访问该网络服务器。
假设您的ESP8266开发板IP地址是192.168.0.111。那么接下来您可以通过浏览器输入
https://192.168.0.111。
注意一定要在ESP8266的IP地址前面加上“https//”。这一操作将会让浏览器通过https协议访问ESP8266所建立的服务器。如果不输入这一信息,浏览器默认会使用http协议而不是https协议。也就达不到我们想要实现的效果。(如下图所示)
当您如上图所示输入完IP地址后,接下来 请按下回车键。您将在浏览器中看到如下警告信息 。这很正常,因为ESP8266的服务器证书不是CA颁布的证书,所以浏览器会警告我们,它无法确定ESP8266服务器的身份信息。请忽略这一警告信息,并按照下图所示,点击按钮。
接下来您将看到如下图所示的信息。该信息正是详细说明为何无法验证ESP8266服务器身份的原因。我们需要继续忽略 这一警告信息,并按照下图所示,点击链接。
如下图所示,您将看到浏览器中出现了“Hello from ESP8266”信息。这一信息是由ESP8266服务器发来的。说明我们的ESP8266服务器已经可以通过HTTPS协议进行数据通讯了。
以下示例程序中我们首先使用语句 X509List *serverCertList = new BearSSL::X509List(server_cert);
建立X509List对象用于处理及储存服务器证书。接下来我们使用了语句PrivateKey *serverPrivKey = new BearSSL::PrivateKey(server_private_key);
建立PrivateKey对象用于处理及储存服务器私钥。最后我们使用语句server.setRSACert(serverCertList, serverPrivKey);
设置服务器证书和服务器私钥。具体使用方法,请见以下程序的高亮部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : WiFiServerSecure_setRSACert 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200421 程序目的/Purpose : 此程序用于演示如何使用使用WiFiServerSecure库的setRSACert来为服务器设置证书和私钥。 本示例程序借鉴ESP8266库中BearSSL_Server示例程序,该程序作者Earle F. Philhower, III ----------------------------------------------------------------------- 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/ ***********************************************************************/ #include <ESP8266WiFi.h> #include <time.h> // WiFi连接信息 const char *ssid = "taichimaker";// WiFi名称 const char *pass = "12345678"; // WiFi密码 // 建立WiFiServerSecure对象 WiFiServerSecure server(443); // 建立服务器响应信息 static const char *HTTP_RES = "HTTP/1.0 200 OK\r\n" "Connection: close\r\n" "Content-Length: 62\r\n" "Content-Type: text/html; charset=iso-8859-1\r\n" "\r\n" "<html>\r\n" "<body>\r\n" "<p>Hello from ESP8266!</p>\r\n" "</body>\r\n" "</html>\r\n"; //服务器私钥 const char server_private_key[] PROGMEM = R"EOF( -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDhDf/pokuS+FQO MPxiDTPMDZEFQjFoy/uCwiN4MebPg+IcXMVx2o6MSn8x9ofAatwAOq/dYoExhev1 HN2C3O4ZjjFACsryL6hYXaKG+qHiNEfvHgPTw0olWsDm9N01CcQs7lJqW2wmM5JM xXP8ZU0rcUU70qWCUUTR+rN8WE4QHTd7BjP6OTvqjN7Al4ibg8//7owXlSECnM1B SKIZQZ6g0QcWLf+rSn6hRrbHPGIkp5RZTIGZ7k9zgUfHQezKKYtRZXRtUhB5JW78 ZyGYaphaek5WlkgakL2pbM/Q/DgKew/2k0najKUjmkz+gxtof4vlmZAojSaN2647 labAbuydAgMBAAECggEAYHi806zDUpvqhC7RcUKRio3iNWvbfD28cZ/AzpwtgZTa DyhhZt22L0Mb5RH1vTDRX7PIgVDhapYqwGaAOcF0uzWtvPMjbc+qDT8OFWhIjou0 rjaik1rqZLrTZ+1dCYhHNK9wWrEX2gRPWWNmxbGy88VZVTyFwCgQJSafW9UKmXLu 4KUTILHcyGsEfVBxth8Vr9uWuNWa6nRW/tb/3uNwRn1ATKV6h+HFgBHxgfkSN11G wZfdSRzuov7Y09qGbIHZmeoBYG8iNJ/A4qOhaMJis1Qmt6mjpBzUJRxGriZIHh2E znoM85Uejc8cqSnWH8mA8PPT4xDwCbv2ueT9bT5HYQKBgQD25qFyjx+Bbzsbok2a lF7wQiN5WbzA5zdCusecTO+Fi2HkrKODFSQdaCHxl/kFKcy7NxYZjeIcNZzf6vnC B2Hyrm3B/eeCJ+WoTm/ajfS6dxgt2aO48An+wFAyb7qGdBBrPr+hvn3RG5hbupEM bGJnBhRfpcq0+9+JcqMfcAUkuQKBgQDpWUMtfuukR+hwkHhbs68FyXbGxnHMGYth sLRWmbmK6OVmSKWDU5kRPlMckztqUReJdE+x6fbvBDbW/cIi83mQa0+7KTxLajoj zoCV6CKZz4dATURlisTtfqVCjQP/wHJ4y6E270Ar80CM/0AT8gw+HrWGLeCa+MQN L0Qg/u5dBQKBgDAsUaXbfQcxH7RFl6SofFmeXfOIacatll+jt9ysOjOxPVlzwbeK wXAnaDAOOd0jCbohhmNYBp0AbOpXm4GbFSZXmDy4gJoplKqhGzvmZLCZGhOgGky0 MQ8OkNc2a4teS/HQ3Wz+kOfi3XhQT4q//vcg/Yqn+4QSfMwBnQg+QBKpAoGAdUch ljoV4Ikrb3eMpjoWmwf4JEsUYonsHXscB/JW6FPJB7E3TluzsJDsYI427GY5OCI2 86otK0+o6EC9U6eez1C/z8cXwKdw9RISWkVDLp640T6EQ6yM8PgXwuzwt5dXcRKW we9ZBz3IkZSv9dZPBOGWRgvEuN6SWjYJPbQixKkCgYA+plfKhE+f+ofA7wWkmfo3 1cyJmyBCL9ROwfzRlo1ftttYy1XHOLxpe2ts+hh+pqrftGdura1X0TuY6v7d1mk1 snuyj7+E37PjIewk4nr45PU4OWwqW2Pqx4BZAYosU+ki1z12rh3ofZhudBH6B5nN TPhoHwGbAajgSzHYYG8koQ== -----END PRIVATE KEY----- )EOF"; // 服务器证书 const char server_cert[] PROGMEM = R"EOF( -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIUCUSExaDX4tk9VoMXia7kABA2pewwDQYJKoZIhvcNAQEL BQAwgbAxCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdC ZWlqaW5nMRUwEwYDVQQKDAxUYWljaGktTWFrZXIxDDAKBgNVBAsMA0lPVDEQMA4G A1UEAwwHRVNQODI2NjFGMEQGCSqGSIb3DQEJARY3dGFpY2hpYW1rZXJAG1tEG1tE G1tEGxtbQxsbW0MbW0MbW0MbdGFpY2hpbWFrZXJAMTYzLmNvbTAeFw0yMDA0MjAx MDQ3MjNaFw0zMTA3MDgxMDQ3MjNaMIGwMQswCQYDVQQGEwJDTjEQMA4GA1UECAwH QmVpamluZzEQMA4GA1UEBwwHQmVpamluZzEVMBMGA1UECgwMVGFpY2hpLU1ha2Vy MQwwCgYDVQQLDANJT1QxEDAOBgNVBAMMB0VTUDgyNjYxRjBEBgkqhkiG9w0BCQEW N3RhaWNoaWFta2VyQBtbRBtbRBtbRBsbW0MbG1tDG1tDG1tDG3RhaWNoaW1ha2Vy QDE2My5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDhDf/pokuS +FQOMPxiDTPMDZEFQjFoy/uCwiN4MebPg+IcXMVx2o6MSn8x9ofAatwAOq/dYoEx hev1HN2C3O4ZjjFACsryL6hYXaKG+qHiNEfvHgPTw0olWsDm9N01CcQs7lJqW2wm M5JMxXP8ZU0rcUU70qWCUUTR+rN8WE4QHTd7BjP6OTvqjN7Al4ibg8//7owXlSEC nM1BSKIZQZ6g0QcWLf+rSn6hRrbHPGIkp5RZTIGZ7k9zgUfHQezKKYtRZXRtUhB5 JW78ZyGYaphaek5WlkgakL2pbM/Q/DgKew/2k0najKUjmkz+gxtof4vlmZAojSaN 2647labAbuydAgMBAAGjUzBRMB0GA1UdDgQWBBTttMAlJ46XNA1ydxe5J0bVfWA3 ujAfBgNVHSMEGDAWgBTttMAlJ46XNA1ydxe5J0bVfWA3ujAPBgNVHRMBAf8EBTAD AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCSQH9T7rWS11DHLvPXuwRx2F675y5bNZ7L 4q0akgdQwH3T4RNRS0yQbcNPqOsiEwypsV45kEjzniBqNcHcfxld1Ik1zcv9wvvK ZE9HfrZbaVRzIR7GPmIzjhdepBK8gPvQoqIHVLM6WTY5/2voGOUPB7NLjDtvVpFN GG3KpNjC6msfywWTCAAB3oNSHeQsy01DD6FSQHGjBZZiXo7P7MOFz/D5+z61OBy0 UiCGi08UjVAodMTfTHNxGZW9D2yLzuKLfewbtcbeje2MACiXLDuIS+ed8YgXn7UH 2SNfx1DhsSGueWgEMISsqJUMgU02IrTu3VViSE7eXoRQkLEdeiGI -----END CERTIFICATE----- )EOF"; void setup() { Serial.begin(9600); Serial.println(); // 连接 WiFi Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); // 建立X509List对象用于处理及储存服务器证书 X509List *serverCertList = new BearSSL::X509List(server_cert); // 建立PrivateKey对象用于处理及储存服务器私钥 PrivateKey *serverPrivKey = new BearSSL::PrivateKey(server_private_key); // 设置服务器证书和服务器私钥 server.setRSACert(serverCertList, serverPrivKey); // 启动服务器 server.begin(); } void loop() { static int cnt; BearSSL::WiFiClientSecure incoming = server.available(); if (!incoming) { return; } Serial.printf("Incoming connection...%d\n",cnt++); // 等待客户端发送请求 uint32_t timeout=millis() + 1000; int lcwn = 0; for (;;) { unsigned char x=0; if ((millis() > timeout) || (incoming.available() && incoming.read(&x, 1) < 0)) { incoming.stop(); Serial.printf("Connection error, closed\n"); return; } else if (!x) { yield(); continue; } else if (x == 0x0D) { continue; } else if (x == 0x0A) { if (lcwn) { break; } lcwn = 1; } else lcwn = 0; } // 发送响应信息 incoming.write((uint8_t*)HTTP_RES, strlen(HTTP_RES)); incoming.flush(); incoming.stop(); Serial.printf("Connection closed.\n"); } |
位置导航: ESP8266库 / WiFiServerSecure库 / 本页