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 sslv2和sslv3的兼容性还是证书问题?_Java_Ssl_Https - Fatal编程技术网

Java sslv2和sslv3的兼容性还是证书问题?

Java sslv2和sslv3的兼容性还是证书问题?,java,ssl,https,Java,Ssl,Https,我有一个运行在服务器“CCC”中的unix脚本,我从中调用另一个服务器“GGG”中运行的servlet(服务器GGG是一个安全的服务器,与普通服务器相比有额外的防火墙) 此外,CCC是一个ETL服务器,具有JRE。脚本使用http调用servlet,因为应用了I规则,所以重定向发生在https上,端口号也在更改 当我试图调用servlet时,我得到了一个错误的证书 servlet URL在普通IE或chrome中给出时,会给我一个有效的响应,我可以点击服务器GGG 我得到的错误是: javax.

我有一个运行在服务器“CCC”中的unix脚本,我从中调用另一个服务器“GGG”中运行的servlet(服务器GGG是一个安全的服务器,与普通服务器相比有额外的防火墙)

此外,CCC是一个ETL服务器,具有JRE。脚本使用http调用servlet,因为应用了I规则,所以重定向发生在https上,端口号也在更改

当我试图调用servlet时,我得到了一个错误的证书

servlet URL在普通IE或chrome中给出时,会给我一个有效的响应,我可以点击服务器GGG

我得到的错误是:

javax.net.ssl.SSLHandshakeException: bad certificate
    at com.ibm.jsse.bg.a(Unknown Source)
    at com.ibm.jsse.b.a(Unknown Source)
    at com.ibm.jsse.b.write(Unknown Source)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:139)
    at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:827)
    at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1975)
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
    at com.tgt.task.client.TaskClient.doGet(TaskClient.java:153)
    at com.tgt.task.client.TaskClient.runClient(TaskClient.java:91)
    at com.tgt.task.client.TaskClient.completeTask(TaskClient.java:68)
    at com.tgt.task.client.TaskClient.main(TaskClient.java:53)
所以,最初我检查了CCC服务器的cacerts中的证书,它拥有所有根证书,除了颁发给URL的证书

我们发现这个问题是在URL的大IP证书更新之后开始的,我已经跟我的网络团队一起调查了这个问题,他们已经确认来自服务器CCC的流量通过防火墙后会很好地通过GGG

因此,当我们试图调用URL时捕获了流量,我们得到以下结果:

client  server  SSLV2   282 Client Hello
server  client  SSLV3   1631    Server Hello
server  client  SSLv3   433 Certificate
client  server  SSLV3   190 Alert(Level: Fatal, Description: Bad Certificate)
您能让我知道问题是由于客户端和服务器使用的SSL版本造成的吗

或者其他一些我在分析中遗漏的东西

我甚至尝试将中的URL的证书导入到服务器CCC中的cacerts,但出现了以下错误:

keytool错误:java.lang.Exception:输入不是X.509证书


因此,我使用PKCS7证书作为URl,并尝试将其转换为.cer并尝试导入,但出现了相同的错误。

如果它与浏览器一起工作,而不是与脚本一起工作,则通常与服务器名称指示(SNI)有关。使用SNI,您可以在同一IP地址后拥有多个具有不同证书的主机。虽然当前所有浏览器都支持SNI,但默认情况下,其他实现可能不支持或不支持SNI。如果客户端无法在同一IP后面有多个证书的站点上使用SNI,它只会获得默认证书,而默认证书通常是错误的


我不知道您运行的是哪个Java版本,但我建议您确定您的版本,然后通过谷歌了解如何在您的版本中使用SNI。据我所知,SNI仅在Java版本7中启用。

我检查了捕获的网络数据包,发现URL根据大IP端的SSL配置向服务器CCC提供了正确的证书,客户端CCC无法验证它。并返回错误的证书消息

在这里,我尝试了openssl并尝试了以下命令:

s_client -connect host:443
verify error:num=20:unable to get local issuer certificate
verify error:num=27:certificate not trusted
verify error:num=21:unable to verify the first certificate

`No client certificate CA names sent`
 SSL handshake has read 1745 bytes and written 304 bytes
 New, TLSv1/SSLv3, Cipher is RC4-SHA
 Server public key is 1024 bit
 Compression: NONE
 Expansion: NONE
 SSL-Session:
Start Time: 1402019174
Timeout   : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
我猜我的服务器没有发送完整的信任链列表,因此,客户端无法验证它

我不确定我的分析是否正确,也参考了以下帖子:


如果我需要发送我的服务器来发送完整的可信链列表,我需要在哪里更改设置?在大Ip端,还是在服务器端?

请将错误缩小到一个简单的可重复使用的用例中(是否在没有重定向的情况下发生?)。这听起来像是Rube Goldberg机器。不,如果不重定向到https,我们就无法调用servlet。我同意您的意见,但我想知道为什么会出现错误的证书?一些附加信息将有助于确定解决方案。当您使用浏览器访问GGG时,您使用的是IP地址还是域名?当CCC访问GGG时,它使用的是IP地址还是域名?看起来您使用的是IBM JRE。你有没有试过使用Oracle JRE来看看它是否有什么不同?我正在使用域名…来攻击服务器GGGT Java版本是“1.4.2”Java(TM)2运行时环境,标准版(build 1.4.2)经典VM(build 1.4.2,J2RE 1.4.2 IBM AIX 5L for PowerPC(64位JVM)build caix64142-20080515(SR11)(启用JIT的:jitc))这将是Java2——我不认为SNI会使用这个旧版本。而且它可能很久以前就不被支持了。