Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当主机名为'_';_Java_Ssl_Https_Java 8 - Fatal编程技术网

Java 当主机名为'_';

Java 当主机名为'_';,java,ssl,https,java-8,Java,Ssl,Https,Java 8,我正在使用这个编程片段,并将其与几个URL一起使用。“”和“”(我使用的实际名称存在-这只是一个示例)。当我运行设置了-Djavax.net.debug=ssl:handshake:data选项的代码时,我看到只在abc.def.com中添加了扩展名,而在ab_c.def.com中没有添加扩展名 我知道java.net.URL包不允许在主机名中使用“\”。这是类似的问题吗?是否有任何解决方法来获取SSL握手,包括带有“389;”的主机名 答案是否定的。这在使用带有HTTPS的标准JDK库的jav

我正在使用这个编程片段,并将其与几个URL一起使用。“”和“”(我使用的实际名称存在-这只是一个示例)。当我运行设置了-Djavax.net.debug=ssl:handshake:data选项的代码时,我看到只在abc.def.com中添加了扩展名,而在ab_c.def.com中没有添加扩展名


我知道java.net.URL包不允许在主机名中使用“\”。这是类似的问题吗?是否有任何解决方法来获取SSL握手,包括带有“389;”的主机名

答案是否定的。这在使用带有HTTPS的标准JDK库的java中不起作用

实际上,没有“正常”的Java方法来解决这个问题。 其他想法:

  • 请服务所有者提供一个不带
    \uu
    的域名
  • 不要使用SSL/HTTPS。大多数未进行严格检查的Java HTTP客户端将使用带有下划线的主机名。如果你在开放的互联网上,这不是一个很好的解决方案
  • 请使用HTTPS,但直接转到IP地址并禁用HTTPS主机名验证。如果你在开放的互联网上,这也是一个坏主意
  • 引入一个MITM或转发代理,它可以为您的服务提供HTTP端点,但会在网络的不受信任部分上执行HTTPS(SSL onload?)
  • 只需跳出到
    curl
    并读取结果字符串,如前所述。在这里要非常小心,因为很容易在无意中暴露出诸如远程代码执行之类的安全问题
  • 使用jni访问允许下划线的网络库-
    libcurl
    显然是一个候选项,但这将比
    系统的工作量大得多。执行
    方法,也可能由于其他原因不安全(内存管理、写得不好的jni互操作的不稳定性、不利于维护)
  • 您可以尝试在
    java.net
    中分叉相关的URI/URL解析类,以删除对下划线的检查。问题是这是一个大规模的黑客攻击,可能有无限的难度,很容易在无意中破坏所有类型的东西,您可能需要构建自己的JDK版本,因为我记得
    java.net
    代码出于某种原因是特殊的,因为您不能在JVM的ext/lib dir中丢弃一个修补过的类(但我可能会将其与其他东西混在一起)

我将提供一个修补程序

在/etc/hosts文件中,在IP中包含一个不带下划线的新条目

比如说,

abc.com xx.xx.xx.xx


然后,在程序中使用abc.com。

\u
在主机名中不是有效字符,因此在URL的主机名部分中也是无效字符。当它位于“域名”(使用RFC1034术语)中时,它可以位于DNS记录中,如CNAME或SRV。但根据URL中的定义,您有主机名,主机名只有字母、数字或连字符(加上一些额外的规则),请参见agree。但也有主机使用“_”,所以要看看是否有任何解决办法。一个解决办法是拒绝与这些站点交谈。如果他们选择忽略这些标准,那就不要让它成为你的问题。值得注意的是,在某些情况下,这显然会使JVM崩溃:。但这可能会导致本机代码崩溃。很难说,这没用。问题不是查找IP地址,而是通过将服务器名称传递给服务器。不要使用SSL/HTTPS。并使用HTTPS,但直接转到IP地址并禁用HTTPS主机名验证。如果服务器是与具有不同主机名的其他服务器共享IP地址的虚拟服务器,则无法工作。这样的配置需要使用HTTPS和SNI来标识服务器实例。I1)服务器重定向到https,2)服务器拒绝了SNI中IP地址为的请求。我选择将其卸载到curl。
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet(url);
System.out.println(httpclient.execute(httpget));