回答
在客户端,您在启动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_set_SSL_CTX()
将SSL
对象切换为SSL_CTX
。
的s_client.c
和s_server.c
文件在apps/
目录OpenSSL的源代码分发的实现这个功能,所以他们是一个很好的资源,看看它应该怎么做。
s_client.c和s_server.c就是很好的例子。我试图在充当负载生成器(网络)的客户端上实施SNI,并使用http/https请求来破坏服务器。而服务器已经实现了服务器端SNI。 – 2011-02-28 07:09:30
服务器调用是否保持在多线程上下文中?看起来SSL_set_SSL_CTX天生就不是线程安全的(即如果你有两个不同的入站连接和两个不同的证书,你会遇到问题)。 – chacham15 2014-05-11 18:57:22
@chacham15:让线程安全的一种方法是为每个线程分配一个SSL_CTX(),每个线程总是处理同一个线程中的SSL和SSL_CTX对象。另一种方法是用'CRYPTO_set_id_callback()'和'CRYPTO_set_locking_callback()'设置线程回调,在这种情况下,OpenSSL将对锁定回调进行正确的调用,以使'SSL_set_SSL_CTX()'线程安全。 – caf 2014-05-17 07:42:18
- 1. Java 6 SNI(服务器名称指示)?
- 2. 使用cURL与SNI(服务器名称指示)
- 3. JBoss Netty:支持SNI(服务器名称指示)
- 4. 从TLS客户端提取服务器名称指示(SNI)hello
- 5. Java上的服务器名称指示(SNI)
- 6. 对服务器角色中的服务器名称指示(SNI)的Java支持?
- 7. 如何通过(服务器名称指示)SNI访问Web应用程序?
- 8. 在javascript中检测SNI(服务器名称指示)浏览器支持
- 9. 在Java 8中,可以通过HttpsURLConnection发送服务器名称指示(SNI)
- 10. M2Crypto是否具有客户端服务器名称指示(SNI)支持?
- 11. SNI(服务器名称指示)可与TLS 1.2,但通过服务器上TLS 1.0
- 12. Play2:支持服务器名称指示
- 13. 自指名称服务器?
- 14. 在Python中获取服务器/服务器名称指示
- 15. 如何从服务实现中读取服务端点名称
- 16. 指向相同实现的多个Web服务名称
- 17. 使用C#可以使用服务器名称指示(SNI)进行SSL连接吗?
- 18. 引用链接服务器而不指定服务器名称
- 19. [SailsJS/sails-mongo] SNI名称
- 20. Openssl TLS扩展支持配置(服务器名称指示)
- 21. 服务器名称对java 1.6的指示支持
- 22. SSMS 2017未显示服务器名称
- 23. *名称服务器*不是有效的名称服务器?
- 24. 设置名称服务器 - 如何?
- 25. 如何选择mongodb服务器名称?
- 26. 如何找到smtp服务器名称
- 27. PowerCLI提示服务器名称为“Connect-VI服务器”
- 28. 如何为我的服务器注册名称服务器?
- 29. 如何找到SQL服务器的服务器名称
- 30. 如何使用“拥有”昵称实现IRC服务器?
另请参阅[为SNI提供一个框中的多个域](http://stackoverflow.com/questions/22373332/serving-multiple-domains-in-one-box-with-sni),了解一些代码示例并使用's_client'来测试你的服务器。 – jww 2014-03-13 15:48:49