фальшивое указание имени сервера (SNI) в libcurl с бэкэндом OpenSSL - PullRequest
1 голос
/ 05 июня 2019

У меня libcurl, собранный с бэкэндом OpenSSL. Я хочу установить SNI для некоторой указанной строки. способ, который я мог найти, это использовать функцию SSL_set_tlsext_host_name, которая берет экземпляр SSL * и строку, а затем устанавливает ее. (см. https://stackoverflow.com/a/5113466/3754125)

Однако curl_easy не имеет обратного вызова для извлечения SSL* экземпляра. Есть ли альтернативный способ сделать это?

Еще немного контекста: В моей среде я должен использовать CURLOPT_RESOLVE для разрешения полного доменного имени в IPv4. Есть полное доменное имя: const char *fqdn IPv4, который fqdn должен разрешить до: uint32_t ipv4 поддельный SNI: const char *sni Суть выглядит примерно так:

CURL *ez;
char buf[ENOUGH];
struct curl_slist *resolver;
/* ... */
snprintf(buf, sizeof(buf), "%s:%d:%d.%d.%d.%d", fqdn, port, IP(IPv4));
resolver = curl_slist_append(NULL, buf);
curl_easy_setopt(ez, CURLOPT_RESOLVE, resolver);

После этого мне нужно установить SNI на поддельный SNI, не касаясь распознавателя.

1 Ответ

1 голос
/ 05 июня 2019

Если вы хотите «подделать» 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);
...