如何实现服务器名称指示(SNI)

时间:2011-02-25 03:38:13

标签: c ssl openssl sni

如何在C或C ++中的OpenSSL上实现服务器名称指示(SNI)?

有没有现实世界的例子?

1 个答案:

答案 0 :(得分:55)

在客户端,您在启动SSL连接之前使用SSL_set_tlsext_host_name(ssl, servername)

在服务器端,它有点复杂:

  • 为每个不同的证书设置额外的SSL_CTX();
  • 使用SSL_CTX();
  • 为每个SSL_CTX_set_tlsext_servername_callback()添加服务器名称回调
  • 在回调中,使用SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name)检索客户端提供的服务器名称。找出与该主机名一致的SSL_CTX,然后将SSL对象切换为SSL_CTX SSL_set_SSL_CTX()

OpenSSL源代码分发的s_client.c目录中的s_server.capps/文件实现了此功能,因此它们是查看应如何完成的良好资源。