【发布时间】:2011-07-04 01:20:06
【问题描述】:
如何用 C 或 C++ 在 OpenSSL 上实现服务器名称指示(SNI)?
是否有任何现实世界的示例可用?
【问题讨论】:
-
另请参阅Serving multiple domains in one box with SNI 获取一些代码示例并使用
s_client测试您的服务器。
如何用 C 或 C++ 在 OpenSSL 上实现服务器名称指示(SNI)?
是否有任何现实世界的示例可用?
【问题讨论】:
s_client 测试您的服务器。
在客户端,您在启动 SSL 连接之前使用SSL_set_tlsext_host_name(ssl, servername)。
在服务器端,稍微复杂一点:
SSL_CTX();SSL_CTX_set_tlsext_servername_callback()为每个SSL_CTX()添加服务器名称回调;SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name) 检索客户端提供的服务器名称。找出正确的SSL_CTX 与该主机名一起使用,然后将SSL 对象切换到SSL_CTX 和SSL_set_SSL_CTX()。OpenSSL 源代码分发的apps/ 目录中的s_client.c 和s_server.c 文件实现了此功能,因此它们是一个很好的资源来了解它应该如何完成。
【讨论】:
SSL_CTX()(并且始终处理来自同一线程的相同SSL 和SSL_CTX 对象) .另一种方法是使用CRYPTO_set_id_callback() 和CRYPTO_set_locking_callback() 设置线程回调,在这种情况下,OpenSSL 将正确调用锁定回调以使SSL_set_SSL_CTX() 线程安全。
SSL_set_SSL_CTX 天生就不是线程安全的?它似乎只影响第一个参数中指定的 SSL 连接。