位置导航: ESP8266库 / WiFiClientSecure库 / 本页
说明
通过WiFiClientSecure语句,我们可以建立WiFiClientSecure对象从而实现ESP8266的HTTPS协议物联网通讯。
语法
WiFiClientSecure httpsClient
注:请参考本页的示例程序部分获取更多应用说明信息。此函数在示例程序中被高亮标记以便您查阅。
参数
无
返回值
无
示例程序
示例1:ESP8266实现HTTPS通讯(指纹认证)
以下程序将实现ESP8266建立与网站的HTTPS通讯,并且将网站服务器响应信息显示于串口监视器中。本程序使用了指纹认证方式。比起本页的“示例2:ESP8266实现HTTPS通讯(证书认证)”,示例1所采用的指纹认证不如证书认证安全性高。
请将以下示例程序中的Wifi联网信息进行调整并将程序上传给ESP8266。程序上传完毕后,ESP8266将会自动连接 WiFi并通过HTTPS协议与www.howsmyssl.com网站服务器进行通讯(该网站专门用于HTTPS通讯测试)。服务器响应信息将会通过串口监视器显示以便我们查阅。程序运行结果如下图所示。
注意:出于安全原因,网站服务器会定期更新证书指纹信息。因此本程序中的证书指纹可能已经过期。请使用浏览器获取最新的服务器证书指纹并复制粘贴到程序中相应位置。如需了解如何执行这一操作,请参考太极创客网站“查看网站证书指纹”页面。
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 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : WiFiClientSecure 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200417 程序目的/Purpose : 此程序用于演示如何使用WiFiClientSecure库中的WiFiClientSecure语句来建立 WiFiClientSecure对象。该对象用于控制ESP8266的HTTPS协议通讯。 以下程序将实现ESP8266开发板建立与网站的HTTPS通讯,并且将网站服务器响应信息 显示于串口监视器中。 本程序使用了指纹认证方式。该方式没有证书认证方式安全。 注意:出于安全原因,网站服务器会定期更新证书指纹信息。因此本程序 中的证书指纹可能已经过期。请使用浏览器获取最新的服务器证书指纹 并复制粘贴到程序中相应位置。如需了解如何执行这一操作,请参考太极创客网站中 “获取网站证书指纹”页面(网址见下): http://www.taichi-maker.com/homepage/iot-development/iot-dev-reference/esp8266-c-plus-plus-reference/http-client-secure/certificate-fingerprint/ ----------------------------------------------------------------------- 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/ ***********************************************************************/ #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <ESP8266WebServer.h> //WiFi连接信息(注意:需要自行修改以下内容否则ESP8266无法连接WiFi) #define ssid "taichimaker" //WiFi名称 #define password "12345678" //WiFi密码 //测试HTTPS通讯的网站 const char *host = "www.howsmyssl.com"; //HTTPS端口443 const int httpsPort = 443; //注意:出于安全原因,网站服务器会定期更新证书指纹信息。因此本程序 //中的证书指纹可能已经过期。请使用浏览器获取最新的服务器证书指纹 //并复制粘贴到此处。如需了解如何执行这一操作,请参考太极创客网站中 //“获取网站证书指纹”页面(网址见下): //http://www.taichi-maker.com/homepage/iot-development/iot-dev-reference/esp8266-c-plus-plus-reference/http-client-secure/certificate-fingerprint/ const char fingerprint[] PROGMEM = "c7c1f454fb33ef22191163c50c12dc7d4842694a"; void setup() { Serial.begin(9600); WiFi.mode(WIFI_STA); //设置ESP8266为无线终端工作模式 WiFi.begin(ssid, password); //连接WiFi Serial.println(""); Serial.println("Connecting"); Serial.println(""); // 等待连接 while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } //成功连接后通过串口监视器显示WiFi名称以及ESP8266的IP地址。 Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // 实现HTTPS通讯 httpsCom(); } void loop(){} void httpsCom(){ WiFiClientSecure httpsClient; //建立WiFiClientSecure对象 Serial.println(host); Serial.printf("Using fingerprint '%s'\n", fingerprint); httpsClient.setFingerprint(fingerprint); httpsClient.setTimeout(15000); delay(1000); Serial.println("HTTPS Connecting");Serial.println(""); int r=0; // 尝试连接服务器并等待 while((!httpsClient.connect(host, httpsPort)) && (r < 30)){ delay(100); Serial.print("."); r++; } // 连接超时后输出"连接失败"信息并返回 if(r==30) { Serial.println("Connection failed"); return; } else { // 连接成功则输出“连接成功”信息 Serial.println("Connected..."); } Serial.print("requesting: "); Serial.println(host); // 建立HTTPS请求信息字符串 String request = String("GET /a/check") + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n" + "\r\n"; // 向服务器发送请求 httpsClient.print(request); Serial.println("request sent"); // 检查服务器响应信息。一旦查到响应头结束字符,则通过串口监视器 // 告知用户当前ESP8266已经成功接收服务器响应头信息。 while (httpsClient.connected()) { String line = httpsClient.readStringUntil('\n'); if (line == "\r") { Serial.println("headers received"); break; } } // 通过串口监视器输出服务器响应体信息(服务器报文) Serial.println("=========="); Serial.println("server response payload:"); String line; while(httpsClient.available()){ line = httpsClient.readStringUntil('\n'); //Read Line by Line Serial.println(line); //Print response } Serial.println("=========="); //操作结束,断开服务器连接 httpsClient.stop(); Serial.println("closing connection"); } |
示例2:ESP8266实现HTTPS通讯(证书认证)
本实例所实现的功能与示例1相同。唯一区别是本示例中在ESP8266与服务器的HTTPS通信中,使用证书认证而不是指纹认证。使用本示例中的证书认证可以提高HTTPS通讯安全性。
如需了解本示例程序的操作方法和运行结果,请参考示例1中的相应内容。
注意:出于安全原因,CA会定期更新根证书信息。因此本程序中的证书可能已经过期。请使用浏览器获取最新的网站根证书并复制粘贴到程序中相应位置。如需了解如何执行这一操作,请参考太极创客网站中
“查看网站根证书”页面。
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 169 170 171 172 173 174 175 176 177 178 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : WiFiClientSecure_2 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200417 程序目的/Purpose : 此程序用于演示如何使用WiFiClientSecure库中的WiFiClientSecure语句来建立 WiFiClientSecure对象。该对象用于控制ESP8266的HTTPS协议通讯。 以下程序将实现ESP8266开发板建立与网站的HTTPS通讯,并且将网站服务器响应信息 显示于串口监视器中。 本程序使用了证书认证方式。该方式比指纹认证方式要更安全。 注意:出于安全原因,CA会定期更新证书信息。因此本程序 中的证书可能已经过期。请使用浏览器获取最新的网站根证书 并复制粘贴到程序中相应位置。如需了解如何执行这一操作,请参考太极创客网站中 “获取网站根证书”页面(网址见下): http://www.taichi-maker.com/homepage/iot-development/iot-dev-reference/esp8266-c-plus-plus-reference/http-client-secure/certificate/ ----------------------------------------------------------------------- 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/ ***********************************************************************/ #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <ESP8266WebServer.h> //WiFi连接信息(注意:需要自行修改以下内容否则ESP8266无法连接WiFi) #define ssid "taichimaker" //WiFi名称 #define password "12345678" //WiFi密码 //测试HTTPS通讯的网站 const char *host = "www.howsmyssl.com"; //HTTPS端口443 const int httpsPort = 443; void setup() { Serial.begin(9600); WiFi.mode(WIFI_STA); //设置ESP8266为无线终端工作模式 WiFi.begin(ssid, password); //连接WiFi Serial.println(""); Serial.println("Connecting"); Serial.println(""); // 等待连接 while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } //成功连接后通过串口监视器显示WiFi名称以及ESP8266的IP地址。 Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); httpsCom(); // 实现https通讯 } void loop() {} // 实现https通讯 void httpsCom(){ //注意:出于安全原因,CA会定期更新证书信息。因此本程序 //中的证书可能已经过期。请使用浏览器获取最新的证书 //并复制粘贴到此处。如需了解如何执行这一操作,请参考太极创客网站中 //“获取网站证书”页面(网址见下): //http://www.taichi-maker.com/homepage/iot-development/iot-dev-reference/esp8266-c-plus-plus-reference/http-client-secure/certificate/ static const char digicert[] PROGMEM = R"EOF( // 证书信息 -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- )EOF"; WiFiClientSecure httpsClient; //建立WiFiClientSecure对象 BearSSL::X509List cert(digicert); // 设置时间 setClock(); Serial.println("Using certificate"); httpsClient.setTrustAnchors(&cert); httpsClient.setTimeout(15000); delay(1000); Serial.println("HTTPS Connecting");Serial.println(""); int r=0; // 尝试连接服务器并等待 while((!httpsClient.connect(host, httpsPort)) && (r < 30)){ delay(100); Serial.print("."); r++; } // 连接超时后输出"连接失败"信息并返回 if(r==30) { Serial.println("Connection failed"); return; } else { // 连接成功则输出“连接成功”信息 Serial.println("Connected..."); } Serial.print("requesting: "); Serial.println(host); // 建立HTTPS请求信息字符串 String request = String("GET /a/check") + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n" + "\r\n"; // 向服务器发送请求 httpsClient.print(request); Serial.println("request sent"); // 检查服务器响应信息。一旦查到响应头结束字符,则通过串口监视器 // 告知用户当前ESP8266已经成功接收服务器响应头信息。 while (httpsClient.connected()) { String line = httpsClient.readStringUntil('\n'); if (line == "\r") { Serial.println("headers received"); break; } } // 通过串口监视器输出服务器响应体信息(服务器报文) Serial.println("=========="); Serial.println("server response payload:"); String line; while(httpsClient.available()){ line = httpsClient.readStringUntil('\n'); //Read Line by Line Serial.println(line); //Print response } Serial.println("=========="); //操作结束,断开服务器连接 httpsClient.stop(); Serial.println("closing connection"); } // 获取网络时间,该时间信息用于证书认证 void setClock() { configTime(3 * 3600, 0, "ntp.ntsc.ac.cn","pool.ntp.org", "time.nist.gov"); // bool configTime(int timezone, int daylightOffset, char *server1, char *server2, char *server3, bool enable); Serial.print("Waiting for NTP time sync: "); time_t now = time(nullptr); while (now < 8 * 3600 * 2) { delay(500); Serial.print("."); now = time(nullptr); } Serial.println(""); struct tm timeinfo; gmtime_r(&now, &timeinfo); Serial.print("Current time: "); Serial.print(asctime(&timeinfo)); } |
位置导航: ESP8266库 / WiFiClientSecure库 / 本页