Почему libcurl не устанавливает SNI для IP-адресов? - PullRequest
5 голосов
/ 30 октября 2019

Я только что заметил, что libcurl не устанавливает поле SNI, когда я использую IP для вызова HTTPS. Я нашел это:

https://github.com/curl/curl/blame/master/lib/vtls/openssl.c

#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
  if((0 == Curl_inet_pton(AF_INET, hostname, &addr)) &&
#ifdef ENABLE_IPV6
     (0 == Curl_inet_pton(AF_INET6, hostname, &addr)) &&
#endif
     sni &&
     !SSL_set_tlsext_host_name(BACKEND->handle, hostname))
    infof(data, "WARNING: failed to configure server name indication (SNI) "
          "TLS extension\n");
#endif

Согласно Curl_inet_pton документации:

 * inet_pton(af, src, dst)
 *      convert from presentation format (which usually means ASCII printable)
 *      to network format (which is usually some kind of binary format).
 * return:
 *      1 if the address was valid for the specified address family
 *      0 if the address wasn't valid (`dst' is untouched in this case)
 *      -1 if some other error occurred (`dst' is untouched in this case, too)

Как и ожидалось, он возвращает 1 для IP-адресов (например 192.160.0.1) и, следовательно, не вызывает SSL_set_tlsext_host_name.

Почему?

1 Ответ

16 голосов
/ 31 октября 2019

Поскольку это не разрешено.

RFC 3546 "Расширения безопасности транспортного уровня (TLS)" раздел 3.1 объясняет это довольно четко:

Литерал IPv4и адреса IPv6 не разрешены в «HostName».

...