OpenSSL支持IPV6吗?

OpenSSL支持IPV6吗?,openssl,ipv6,Openssl,Ipv6,我有一个运行在Windows、Linux、Solaris和HPUX上的C应用程序,它通过套接字调用SSL\u read()和SSL\u write()。在任何版本的OpenSSL中,IPV6是否支持此功能 从我的搜索来看,这似乎并不明显。我在1.0版BIO代码中找到了一些INET6定义。我还从某个地方读到,要使IPV6正常工作,需要执行指定INET6的普通套接字调用,然后使用BIO\u set\u fd()使IPV6正常工作。这是正确的吗?我不知道OpenSSL和IPv6的详细信息,但从总体上看

我有一个运行在Windows、Linux、Solaris和HPUX上的C应用程序,它通过套接字调用
SSL\u read()
SSL\u write()
。在任何版本的OpenSSL中,IPV6是否支持此功能


从我的搜索来看,这似乎并不明显。我在1.0版BIO代码中找到了一些INET6定义。我还从某个地方读到,要使IPV6正常工作,需要执行指定INET6的普通套接字调用,然后使用
BIO\u set\u fd()
使IPV6正常工作。这是正确的吗?

我不知道OpenSSL和IPv6的详细信息,但从总体上看,OpenSSL for TLS连接在TCP层运行,这与IPv4和IPv6相同。任何更改都不会影响您的应用程序。

我也有同样的问题。我必须使用IPV6编写一个非阻塞TLS服务器。这基本上就是您想要使用的:

/* 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接口一样糟糕-与IPV4接口一样糟糕)与IPV4 100%兼容。事实上,我甚至不再使用IPV4结构编程,因为我已经学习了IPV6 BSD库接口

IPV4地址只是::ffff:xxx.xxx.xxx.xxx-其中xxx.xxx.xxx.xxx是IPV4地址。下面是一个函数,它可以将\u addr中的结构转换为6\u 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完全兼容。当使用IPV6结构中编码的IPV4地址时,实际的网络流量仍然是IPV4—至少在Linux下是这样。

如果您可以使用普通套接字API,那么它应该是现成的。OpenSSL自身的BIO API本身也支持IPv6,但为此,库应使用OpenSSL_USE_IPv6 1选项编译。