Если вы хотите «подделать» SNI, тогда CURLOPT_RESOLVE
или CURLOPT_CONNECT_TO
- это доступные варианты для достижения той же конечной цели.
Пример CURLOPT_RESOLVE
Запустите сервер HTTPS на 127.0.0.1, но заставьте curl думать, что example.com
при подключении к нему (поэтому он отправляет это как SNI и в заголовке Host:
)
CURL *curl;
struct curl_slist *host = NULL;
host = curl_slist_append(NULL, "example.com:443:127.0.0.1");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_RESOLVE, host);
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
}
curl_slist_free_all(host);
CURLOPT_CONNECT_TO пример
ВыполнитьHTTPS-сервер dev на имени хоста server1.example.com
, но вы хотите, чтобы curl подключился к нему, думая, что это сервер www.example.org
.
CURL *curl;
struct curl_slist *connect_to = NULL;
connect_to = curl_slist_append(NULL, "www.example.org::server1.example.com:");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_CONNECT_TO, connect_to);
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.org");
curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
}
curl_slist_free_all(connect_to);