Java 当主机名为'_';
我正在使用这个编程片段,并将其与几个URL一起使用。“”和“”(我使用的实际名称存在-这只是一个示例)。当我运行设置了-Djavax.net.debug=ssl:handshake:data选项的代码时,我看到只在abc.def.com中添加了扩展名,而在ab_c.def.com中没有添加扩展名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
我知道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互操作的不稳定性、不利于维护)系统的工作量大得多。执行
- 您可以尝试在
中分叉相关的URI/URL解析类,以删除对下划线的检查。问题是这是一个大规模的黑客攻击,可能有无限的难度,很容易在无意中破坏所有类型的东西,您可能需要构建自己的JDK版本,因为我记得java.net
代码出于某种原因是特殊的,因为您不能在JVM的ext/lib dir中丢弃一个修补过的类(但我可能会将其与其他东西混在一起)java.net
然后,在程序中使用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));