位置导航: ESP8266库 / WiFiClientSecure库 / 本页
说明
setClientRSACert函数可以用来设置客户端私钥以及客户端证书。
注意:使用ESP8266通过HTTPS协议获取网站信息时,网站服务器无需ESP8266提供证书信息即可实现通信。但是在一些MQTT协议物联网应用中,服务器会需要ESP8266提供客户端证书以验证身份。
语法
httpsClient.setClientRSACert(clientCert, clientPrivateKey)
参数
clientCert:客户端证书
clientPrivateKey:客户端私钥
返回值
无
示例程序
以下程序将实现ESP8266建立与网站的HTTPS通讯,并且将网站服务器响应状态码以及响应头信息显示于串口监视器中。
请将以下示例程序中的Wifi联网信息进行调整并将程序上传给ESP8266。程序上传完毕后,ESP8266将会自动连接 WiFi并通过HTTPS协议与必应网站服务器进行通讯。服务器响应状态码以及响应头信息显示于串口监视器中以便我们查阅。
在以下示例程序中,我们在使用setClientRSACert前需要首先使用X509List clientCert(digicert)
来设置ESP8266的客户端证书。接下来使用 PrivateKey clientPrivateKey(key)
来设置客户端私钥。具体操作方法,请见以下程序中高亮语句部分。
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 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : ESP8266-WiFiClientSecure-setClientRSACert 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200418 程序目的/Purpose : 以下程序将实现ESP8266开发板建立与网站的HTTPS通讯,并且将网站服务器响应信息 显示于串口监视器中。程序使用WiFiClientSecure库中的setClientRSACert函数来设置客户端 私钥以及客户端证书。 对于使用HTTPS协议访问网站信息,网站服务器无需客户端提供证书信息。此程序仅仅是为了向您演示 如何来为ESP8266设置客户端私钥以及客户端证书。 注意:此程序使用网站服务器证书指纹作为服务器身份认证。 出于安全原因,网站服务器会定期更新证书指纹信息。因此本程序 中的证书指纹可能已经过期。请使用浏览器获取最新的服务器证书指纹 并复制粘贴到程序中相应位置。如需了解如何执行这一操作,请参考太极创客网站中 “获取网站证书指纹”页面(网址见下): 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 = "cn.bing.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/ //以下两行语句为两种不同类型的fingerprint建立。 //const char fingerprint[] PROGMEM = "62914576dc0afac83c4804bcc2c1b700a61139fe"; const char *fingerprint = "62914576dc0afac83c4804bcc2c1b700a61139fe"; 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(){ // 客户端证书信息 static const char digicert[] PROGMEM = R"EOF( -----BEGIN CERTIFICATE----- MIIDiDCCAnACAQEwDQYJKoZIhvcNAQELBQAwgYkxCzAJBgNVBAYTAkNOMRAwDgYD VQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5nMRUwEwYDVQQKDAxUYWljaGkt TWFrZXIxDDAKBgNVBAsMA0lPVDENMAsGA1UEAwwEQ1lOTzEiMCAGCSqGSIb3DQEJ ARYTdGFpY2hpbWFrZXJAMTYzLmNvbTAeFw0yMDA0MTkwNzU4NDlaFw0yMzAxMTMw NzU4NDlaMIGJMQswCQYDVQQGEwJDTjEQMA4GA1UECAwHQmVpamluZzEQMA4GA1UE BwwHQmVpamluZzEVMBMGA1UECgwMVGFpY2hpLU1ha2VyMQwwCgYDVQQLDANJT1Qx DTALBgNVBAMMBENZTk8xIjAgBgkqhkiG9w0BCQEWE3RhaWNoaW1ha2VyQDE2My5j b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC+x7sS+0izluDQ6XJ mLv9Kxh9MYG9zRrgigsTQwyv085hDyDGxaKG58ZVZfa7X+srSQ5IssaKoJqK91qT au28rcYQihBFYkGngJc1gFOyMJujFU0VDPxmSuSBUWCPcXbGg0Z4sy/z1vt2pe19 AuqyKVJCDHMCRkMeX/nWbYWHqJTPoAnOZ1CW91urCc2Kf1/eq6L5aFsgjbuuY119 3KP7VdumeHhbsSr6JrDwW/URtun3UjB/LjdbjHoq5bMuY94vgCGO0ykSds25jkz5 rz+32obSNAreNcR9Mz9IPX6mYEP1Yj6Fv7V6zoJYNxyNiO5UYRxC5w0g9ihhaqmQ VLofAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAGqOfdH56LZt7WO18ymgcMRZZakH 629BYu/fsX+t/mgdQ7coPQneGfHD7y2PDB76nIp+wqjlI0mAoVaGmCRny5wWOKpZ bbvW6Kwn42dVab3M+zerM4ExzP3jeG76tsHbXZSHz1fUxASNONjcNjyh/s0HZcQw TgnGkFhpmMKXDkE4kU5T4itxn5j1mkVZjYOwL3d+IS8o3vmzgLCvwa4/BSK70xF3 idoY6tl9bdkzU8nH4HKU8q5vjr3dh2HqWg6H7wOLx840BipKnvj4kago6AJILQ5v go3D93eEiK3NRq/jNXJET+7/NC8xPNeKtraxlYc1o+lbQl/AqsJTBojWifs= -----END CERTIFICATE----- )EOF"; // 客户端私钥信息 static const char key[] 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对象 X509List clientCert(digicert); //建立X509List对象用于处理客户端证书 PrivateKey clientPrivateKey(key); //建立PrivateKey对象用于处理客户端私钥 // 设置客户端私钥以及客户端证书 httpsClient.setClientRSACert(&clientCert, &clientPrivateKey); 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'); 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库 / 本页