OpenSSL поддерживает IPV6? - PullRequest
       8

OpenSSL поддерживает IPV6?

2 голосов
/ 14 ноября 2011

У меня есть приложение на C, работающее в Windows, Linux, Solaris и HPUX, которое вызывает SSL_read() и SSL_write() через сокет.Поддерживается ли эта функциональность через IPV6 в любой версии OpenSSL?

Из моих поисков это не кажется очевидным.Я нашел некоторые определения INET6 в коде BIO версии 1.0.Я также где-то читал, что для работы IPV6 вы выполняете обычные вызовы сокетов, определяя INET6, а затем используете BIO_set_fd() для работы IPV6.Это правильно?

Ответы [ 2 ]

1 голос
/ 21 июля 2018

У меня такая же проблема.Я должен написать неблокирующий сервер TLS, используя IPV6.В основном это то, что вы хотите использовать:

/* Create a socket BIO attached to an already existing socket 
 * descriptor.  The socket descriptor will be closed when the BIO is 
 * destroyed. */ 
bio = BIO_new_socket(sd, BIO_CLOSE); 

Конечно, как говорится, сначала нужно создать сокет.Это взято из "Сетевая безопасность с OpenSSL", которая немного устарела.Вам нужна эта книга для правильного использования OpenSSL, получите ее.

Это особенно расстраивает, что нет прямой поддержки IPV6, потому что интерфейс сокета IPV6 BSD (как бы он ни был ужасен - столь же ужасен, как и интерфейс IPV4)на 100% совместим с IPV4.На самом деле, я даже больше не программирую, используя структуры IPV4, так как я изучил интерфейс библиотеки BSD IPV6.

Адреса IPV4 просто :: ffff: xxx.xxx.xxx.xxx - где xxx.xxx.xxx.xxx - это адрес IPV4.Вот функция, которая преобразует struct in_addr в struct in6_addr:

/////////////////////////////////////////////////////////
// NOTE: it's safe for ((void *)pin) == ((void*) pout) //
/////////////////////////////////////////////////////////
struct in6_addr *sockaddr_in_to_6 (struct in_addr *pin, struct in6_addr *pout)
{
  // as IPV6 IPV4 address is stored as 0000:0000:0000:0000:0000:FFFF:AABB:CCDD
  // where IPV4 address is AA.BB.CC.DD
  pout->s6_addr[0x0c] = ( (struct in6_addr *)pin)->s6_addr[0x00];
  pout->s6_addr[0x0d] = ( (struct in6_addr *)pin)->s6_addr[0x01];
  pout->s6_addr[0x0e] = ( (struct in6_addr *)pin)->s6_addr[0x02];
  pout->s6_addr[0x0f] = ( (struct in6_addr *)pin)->s6_addr[0x03];

  pout->s6_addr[0x00] = 0x00;
  pout->s6_addr[0x01] = 0x00;
  pout->s6_addr[0x02] = 0x00;
  pout->s6_addr[0x03] = 0x00;
  pout->s6_addr[0x04] = 0x00;
  pout->s6_addr[0x05] = 0x00;
  pout->s6_addr[0x06] = 0x00;
  pout->s6_addr[0x06] = 0x00;
  pout->s6_addr[0x07] = 0x00;
  pout->s6_addr[0x08] = 0x00;
  pout->s6_addr[0x09] = 0x00;

  pout->s6_addr[0x0a] = 0xFF;
  pout->s6_addr[0x0b] = 0xFF;

  return pout;
}

Вам больше никогда не понадобится использовать struct in_addr с этим, и она полностью совместима с IPV4.При использовании адреса IPV4, закодированного в структурах IPV6, фактический сетевой трафик все еще остается IPV4 - по крайней мере, в Linux.

0 голосов
/ 17 декабря 2011

Я не знаю подробностей об OpenSSL и IPv6, но с общей точки зрения OpenSSL для соединений TLS работает на уровне TCP, который одинаков для IPv4 и IPv6. Никакие изменения не должны влиять на ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...