ESP32でHTTPSアクセス、ただし証明書検証なし
HTTPClientを使ったHTTPSアクセス(証明書検証なし)
次は、HTTPS URLに接続してデータを取得する例です。ただし、この例ではSSL証明書の検証を行っていません。
ソースコード
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#ifndef WIFI_SSID
#define WIFI_SSID "" // TODO WiFi SSID (2.4GHz only)
#endif
#ifndef WIFI_PASSWORD
#define WIFI_PASSWORD "" // TODO WiFiパスワード
#endif
#ifndef END_POINT
#define END_POINT "" // TODO アクセス先URL
#endif
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
if ((WiFi.status() == WL_CONNECTED)) {
HTTPClient http;
http.begin(END_POINT);
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(payload);
}
http.end(); //Close connection
}
delay(10000); //Send a request every 10 seconds
}
HTTPClientについて
HTTPClient は高レベルのHTTPクライアントライブラリです。HTTPリクエスト(GET, POST, PUT, DELETEなど)を簡単に扱うための関数を提供します。URLに基づいてHTTPリクエストを送信し、レスポンスを取得するのに使用されます。レスポンスのボディやヘッダーの読み取り、HTTPステータスコードの取得などが可能です。HTTPClient は内部的に WiFiClient や WiFiClientSecure を使用して、実際のTCP接続を行います。
WiFiClientSecureを使ったHTTPSアクセス(証明書検証なし)
WiFiClientSecure を使ってHTTPSでリクエストを行う例です。HTTPヘッダーなどを自由にカスタマイズできるため、HTTPClient よりも、よりきめ細かな実装ができます。ソースコード
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#ifndef WIFI_SSID
#define WIFI_SSID "" // TODO WiFi SSID (2.4GHz only)
#endif
#ifndef WIFI_PASSWORD
#define WIFI_PASSWORD "" // TODO WiFiパスワード
#endif
#ifndef HOST
#define HOST "" // TODO アクセス先のホスト
#endif
#ifndef PAGE
#define PAGE "" // TODO アクセス先のページ
#endif
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
WiFiClientSecure client;
client.setInsecure(); // サーバー証明書の検証なしで接続
if (!client.connect(HOST, 443)) {
Serial.println("connection failed");
return;
}
String request = "GET " + String(PAGE) + " HTTP/1.1\r\nHost: " + String(HOST) + "\r\nConnection: close\r\n\r\n";
client.print(request);
Serial.println("request sent");
bool isHeader = true;
String header, body;
while (client.connected() || client.available()) {
if (client.available()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
isHeader = false;
continue;
}
if (isHeader) {
header += line + "\n"; // ヘッダーを保存
} else {
body += line + "\n"; // ボディを保存
}
}
}
client.stop();
Serial.println("Headers:\n" + header);
Serial.println("Body:\n" + body);
}
delay(10000); // 10秒毎にリクエスト
}
WiFiClientSecureについて
WiFiClientSecure は、SSL/TLSを用いた安全なTCP接続を提供するクライアントライブラリです。このクラスは WiFiClient クラスを拡張し、HTTPSとの通信(SSL/TLSを使用した暗号化通信)をサポートします。サーバーのSSL証明書の検証、クライアント証明書の使用など、セキュリティに関連する追加機能があります。低レベルのTCP通信を行う際に使用され、HTTPのプロトコルレベルの詳細(ヘッダーの構築、メソッドの指定など)は自分で処理する必要があります。
証明書の検証なしでアクセスするリスク
証明書の検証なしでアクセスするリスクに関してChatGPTに聞いてみました。
証明書を確認しないHTTPS通信でも暗号化はされていますが、セキュリティリスクが存在します。通信自体は暗号化されているため、中間者(第三者)による通信内容の直接的な読み取り(傍受)は防げますが、他のセキュリティ上の問題が生じる可能性があります。
証明書の確認を省略した場合のリスク:
- 中間者攻撃(Man-in-the-Middle Attack): 証明書を検証しないと、攻撃者が偽の証明書を使って自身を正当なサーバーと偽装することが可能です。これにより、クライアントとサーバー間の通信が攻撃者によって傍受・改ざんされる可能性があります。
- 偽のサーバーへの接続: 証明書の検証なしにHTTPS通信を行うと、クライアントは偽のサーバーに接続しているかもしれないというリスクがあります。この場合、送信されるデータは攻撃者によって容易にアクセスされる可能性があります。
HTTPS通信はSSL/TLSプロトコルを使用して暗号化されます。これは、送受信されるデータが暗号化されるため、中間者によるデータの直接的な読み取りを防ぎます。しかし、証明書の検証を行わない場合、その暗号化された通信が本当に正当なサーバーと行われているのか、その保証がありません。
結論として、 HTTPS通信では通信内容は暗号化されていますが、証明書の検証を省略することによるセキュリティリスクは依然として高いです。セキュアな通信を保証するためには、証明書の検証を行うことが重要です。特に、機密性の高いデータを扱う場合や公開される製品・サービスでは、証明書の検証を適切に行うべきです。