位置导航: ESP8266库 / WiFiClientSecure库 / 本页
说明
在使用ESP8266实现HTTPS协议物联网通讯时,我们可以使用服务器公钥进行服务器身份认证。setKnownKey函数用于安装服务器公钥,以便ESP8266进行服务器身份认证。(公钥是服务器认证的关键。请确保服务器公钥正确,否则您的物联网通讯可能受到安全威胁。)
如需获取网站服务器公钥,可以先使用浏览器将服务器证书下载(注意这里下载的是服务器证书而不是根证书)。
如需了解具体如何获取服务器证书,请点击此处进入查看网站证书和公钥。
请注意:在使用本函数前需要先建立PublicKey对象。并且将该对象作为setKnownKey的参数。如需了解具体操作方法,请见本函数页面的示例程序部分。
语法
httpsClient.setKnownKey(key);
参数
key: 公钥信息(类型:PublicKey*)
返回值
无
示例程序
以下程序将实现ESP8266建立与网站的HTTPS通讯,并且将网站服务器响应状态码以及响应头信息显示于串口监视器中。
请将以下示例程序中的Wifi联网信息进行调整并将程序上传给ESP8266。程序上传完毕后,ESP8266将会自动连接 WiFi并通过HTTPS协议与必应网站服务器进行通讯。服务器响应状态码以及响应头信息显示于串口监视器中以便我们查阅。程序运行结果如下图所示。
通过以上截屏,我们可以看到服务器响应状态码为200 OK。这一信息说明必应网站服务器已经成功地与ESP8266取得连接,另外服务器也已经成功的收到了ESP8266通过HTTPS协议发送的请求信息。
在以下示例程序中,我们使用了语句PublicKey key(pubkey)
建立了公钥对象,并且将该对象作为参数应用在 httpsClient.setKnownKey(&key)
语句中。具体操作方法请见以下示例程序中高亮语句部分。
注:此程序中的公钥是服务器公钥,而不是CA公钥。如需获取该服务器公钥,可以先使用浏览器将服务器证书下载,(如需了解如何执行这一操作,请参考太极创客网站查看网站证书和公钥页面)。假设此处下载的服务器证书名称为“bing.cer”,接下来可以使用OpenSSL工具软件通过以下指令从服务器证书中提取服务器公钥:
openssl x509 -pubkey -noout -in bing.cer。
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 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : ESP8266-WiFiClientSecure-setKnownKey_bing 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200418 程序目的/Purpose : 以下程序将实现ESP8266开发板建立与网站的HTTPS通讯,并且将网站服务器响应信息 显示于串口监视器中。本程序使用了setKnownKey来利用服务器公钥实现服务器身份认证方式。 注:此程序中的公钥是服务器公钥,而不是CA公钥。如需获取该公钥,可以先使用浏览器将服务器 证书下载(假设此处下载的服务器证书名称为www-bing-com.pem)。然后使用openssl通过 以下指令从服务器证书中提取服务器公钥: openssl x509 -pubkey -noout -in www-bing-com.pem 注意:出于安全原因,网站服务器会定期更新公钥信息。因此本程序 中的公钥可能已经过期。请使用以上方法获取最新的服务器公钥 并复制粘贴到程序中相应位置。 ----------------------------------------------------------------------- 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页: 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 = "cn.bing.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(){ // 使用openssl获取网站服务器公钥(具体方法详见程序头部说明信息) // 并将其复制粘贴到以下数组中。 static const char pubkey[] PROGMEM = R"KEY( -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4SJT29Ij+8UZlEnCuN0C Owov5b3zLploURQB3Bc4yAx7O+LKtAfs3vB1uT0ei1kXv3d8keXQvO4ELNKlxorc 7D/b1iXKcCldu97ZZ1ohH4GcebbzQhXRzqqGKBy92vM3nfyZBkxHl7pBhF9E3gYA o3FU4+akcSYY5VsbNwHAf6uH+L4t0BvNE20lNlDtJZL4b37O9wtY6ou2bKYmv2LD KnEOl/gDwGfuILio0K+at9rc49hRrSTumZmbjVfVsG99vPdVIcGdw9j6yHJwjZSE NfxWoeopu1XOu6jtsf/vq+4Duz7UfG8ghZxbjVFUMYUiJApI+hbz8XGHn6JNMCdF UQIDAQAB -----END PUBLIC KEY----- )KEY"; WiFiClientSecure httpsClient; //建立WiFiClientSecure对象 PublicKey key(pubkey); Serial.println("Using public key"); httpsClient.setKnownKey(&key); 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 /") + " 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'); Serial.println(line); if (line == "\r") { Serial.println("headers received"); break; } } Serial.println("Now disconect from the server..."); //操作结束,断开服务器连接 httpsClient.stop(); Serial.println("closing connection"); } |
位置导航: ESP8266库 / WiFiClientSecure库 / 本页