Java 7中是否有一个getRequestedServerNames()等价物?

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时,是否有一个解决方案来获取服务器名称 我希望得到任何指导 谢谢

我试图在我当前的项目中使用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)
界面:

  • 自己接受TCP连接(显式或替换SSLServerSocket)

  • 阅读ClientHello并解析您想要的片段,即SNI扩展

  • Socket
    创建一个包装器,该包装器记住此数据,并具有类似于包含ClientHello的
    字节[]
    的内容,当调用
    read
    时,它首先返回已经读取的ClientHello,然后从实际套接字读取,而
    write
    和其他操作照常工作

  • 在这个包装器套接字的上方创建一个服务器端
    SSLSocket
    ,并像往常一样使用它

  • 当您想要获取SNI时,例如在
    X509KeyManager
    回调中,不要从
    [SSL]套接字查看
    extendedslsession
    ,而是将
    Socket
    向下投射到包装器套接字并查看那里。(您可以将此设置为MyWrapper的
    套接字实例的条件,这样当您使用java8时,它就会自动关闭。)


  • 如果您使用的是
    SSLEngine
    接口,那么您已经在管理连接和I/O,因此您只需执行2、3A和5:在将第一个输入(ClientHello)馈送到
    SSLEngine
    之前,解析它并将其保存在包装器中,当您想要查看它时,请使用包装器。

    另请参见,和。抱歉,你能告诉我如何使用这些信息吗?他们似乎使用SSL_get_servername,我想这就是我希望在Java7中找到的实现?谢谢它们是OpenSSL调用。为什么这个问题有OpenSSL标签?