Java 7中是否有一个getRequestedServerNames()等价物?
我试图在我当前的项目中使用SNI模式,其中客户端启动到服务器的SSL连接。我希望我的服务器知道客户端打算连接到哪个主机/服务器名。此服务器名称由客户端提供。我有一个ExtendedSSLSession对象,但因为我使用的是Java 7,所以我不能使用getRequestedServerNames()方法(它是在Java 8中引入的)来实现我想要的确切功能。不幸的是,我目前的情况不允许我升级java版本 我想问问社区,在使用Java7时,是否有一个解决方案来获取服务器名称 我希望得到任何指导Java 7中是否有一个getRequestedServerNames()等价物?,java,ssl,openssl,java-7,sni,Java,Ssl,Openssl,Java 7,Sni,我试图在我当前的项目中使用SNI模式,其中客户端启动到服务器的SSL连接。我希望我的服务器知道客户端打算连接到哪个主机/服务器名。此服务器名称由客户端提供。我有一个ExtendedSSLSession对象,但因为我使用的是Java 7,所以我不能使用getRequestedServerNames()方法(它是在Java 8中引入的)来实现我想要的确切功能。不幸的是,我目前的情况不允许我升级java版本 我想问问社区,在使用Java7时,是否有一个解决方案来获取服务器名称 我希望得到任何指导 谢谢
谢谢大家! 好吧,JDK 7和8是开源的,所以原则上你可以把必要的新代码移植到后台,构建你自己的版本(称为7.5?)——至少如果你的需求只是停留在java7 API上,而不是官方的java7 JRE上。但是,如果您谈论的是大量的运行时系统或应用程序,尤其是业务关键型系统或应用程序,那么支持这些系统或应用程序可能会很麻烦 作为一种解决办法,我认为——但还没有弄清楚所有细节——你可以偷偷地使用等价的,在java8中也是新的,根据文档“underbox”,出于同样的原因。特别是如果您使用的是“简单”
SSLServerSocket
或SSLSocket(client=false)
界面:
Socket
创建一个包装器,该包装器记住此数据,并具有类似于包含ClientHello的字节[]
的内容,当调用read
时,它首先返回已经读取的ClientHello,然后从实际套接字读取,而write
和其他操作照常工作SSLSocket
,并像往常一样使用它X509KeyManager
回调中,不要从[SSL]套接字查看extendedslsession
,而是将Socket
向下投射到包装器套接字并查看那里。(您可以将此设置为MyWrapper的套接字实例的条件,这样当您使用java8时,它就会自动关闭。)
如果您使用的是
SSLEngine
接口,那么您已经在管理连接和I/O,因此您只需执行2、3A和5:在将第一个输入(ClientHello)馈送到SSLEngine
之前,解析它并将其保存在包装器中,当您想要查看它时,请使用包装器。另请参见,和。抱歉,你能告诉我如何使用这些信息吗?他们似乎使用SSL_get_servername,我想这就是我希望在Java7中找到的实现?谢谢它们是OpenSSL调用。为什么这个问题有OpenSSL标签?