位置导航: ESP8266库 / WiFiClientSecure库 / 本页
说明
setCertStore函数用于为ESP8266设置CertStore(证书集)。
如果您知道ESP8266要连接哪些服务器,那么您就不需要CertStore。但是,如果您不知道ESP8266将要连接并验证哪些服务器身份, CertStore可以让您从几十个甚至上百个存储在SPIFFS或SD中的证书里选择证书从而进行服务器身份验证。这一过程很像是浏览器在验证网站服务器身份时所使用的方法。
语法
httpsClient.setCertStore(certStore)
参数
certStore:证书集对象
返回值
无
示例程序
以下示例程序
在运行程序之前,请先下载certs-from-mozilla.py。然后使用certs-from-mozilla.py下载证书集,接下来请将生成的.AR文件上传到SPIFFS或SD。(如需了解如何向ESP8266的SPIFFS上传文件,请前往《零基础入门学用物联网》教程的ESP8266 NodeMCU 闪存文件系统(SPIFFS)部分)
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 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : ESP8266-WiFiClientSecure-setCertStore 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 日期/Date(YYYYMMDD) : 20200418 程序目的/Purpose : 本程序是ESP8266库中的BearSSL_CertStore示例程序。仅对程序注释信息做了翻译。 以下是原程序头注释翻译。 如果您知道ESP8266要连接哪些服务器,那么您就不需要CertStore。但是,如果您不知 道ESP8266将要连接并验证哪些服务器身份, CertStore可以让您从几十个甚至上百个 存储在SPIFFS或SD中的证书里选择证书从而进行服务器身份验证。这一过程很像是浏览器 在验证网站服务器身份时所使用的方法。 在运行程序之前,必须使用certs-from-mozilla.py下载证书集然后将生成的.AR文件 上传到SPIFFS或SD。您不需要生成“ .IDX”文件,它是CertStore对象生成时自动生成 并且由ESP8266创建并写入SD或SPIFFS。certs-from-mozilla.py可通过以下链接下载: http://www.taichi-maker.com/wp-content/uploads/2020/04/certs-from-mozilla.zip certs-from-mozilla.py可以从互联网获取Mozilla.org的证书集。但是请不要以此 为认可或要求:用户(您)可以自行决定将要用作信任基础的证书。 2018年3月 作者:Earle F. Philhower, III Released to the public domain ----------------------------------------------------------------------- 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/ ***********************************************************************/ #include <ESP8266WiFi.h> #include <CertStoreBearSSL.h> #include <time.h> #include <FS.h> #ifndef STASSID #define STASSID "your-ssid" #define STAPSK "your-password" #endif const char *ssid = STASSID; const char *pass = STAPSK; // 建立CertStore对象。 BearSSL::CertStore certStore; // 通过互联网获取时间信息,该信息用于x.509证书验证 void setClock() { configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov"); 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)); } // 连接服务器 void fetchURL(BearSSL::WiFiClientSecure *client, const char *host, const uint16_t port, const char *path) { if (!path) { path = "/"; } Serial.printf("Trying: %s:443...", host); client->connect(host, port); if (!client->connected()) { Serial.printf("*** Can't connect. ***\n-------\n"); return; } Serial.printf("Connected!\n-------\n"); client->write("GET "); client->write(path); client->write(" HTTP/1.0\r\nHost: "); client->write(host); client->write("\r\nUser-Agent: ESP8266\r\n"); client->write("\r\n"); uint32_t to = millis() + 5000; if (client->connected()) { do { char tmp[32]; memset(tmp, 0, 32); int rlen = client->read((uint8_t*)tmp, sizeof(tmp) - 1); yield(); if (rlen < 0) { break; } // 仅仅输出服务器响应状态码信息 char *nl = strchr(tmp, '\r'); if (nl) { *nl = 0; Serial.print(tmp); break; } Serial.print(tmp); } while (millis() < to); } client->stop(); Serial.printf("\n-------\n"); } void setup() { Serial.begin(115200); Serial.println(); Serial.println(); SPIFFS.begin(); // 如果使用 SD 卡或者LittleFS库, 请使用::begin // 连接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()); setClock(); // X.509 认证用对时 int numCerts = certStore.initCertStore(SPIFFS, PSTR("/certs.idx"), PSTR("/certs.ar")); Serial.printf("Number of CA certs read: %d\n", numCerts); if (numCerts == 0) { Serial.printf("No certs found. Did you run certs-from-mozilla.py and upload the SPIFFS directory before running?\n"); return; // Can't connect to anything w/o certs! } BearSSL::WiFiClientSecure *bear = new BearSSL::WiFiClientSecure(); // 应用证书集(cert store) bear->setCertStore(&certStore); Serial.printf("Attempting to fetch https://www.github.com/...\n"); fetchURL(bear, "www.github.com", 443, "/"); delete bear; } void loop() { Serial.printf("\nPlease enter a website address (www.blah.com) to connect to: "); String site; do { site = Serial.readString(); } while (site == ""); // Strip newline if present site.replace(String("\r"), emptyString); site.replace(String("\n"), emptyString); Serial.printf("https://%s/\n", site.c_str()); BearSSL::WiFiClientSecure *bear = new BearSSL::WiFiClientSecure(); // Integrate the cert store with this connection bear->setCertStore(&certStore); fetchURL(bear, site.c_str(), 443, "/"); delete bear; } |
位置导航: ESP8266库 / WiFiClientSecure库 / 本页