【发布时间】:2014-07-25 23:22:21
【问题描述】:
我在服务器“CCC”中运行了一个 unix 脚本,从中调用在另一台服务器“GGG”中运行的 servlet。(服务器 GGG 是一个安全服务器,与普通服务器相比具有额外的防火墙)
另外,CCC 是一个 ETL 服务器,它有一个 JRE。脚本使用http调用servlet,因为应用了I规则,所以重定向到https,端口号也在变化。
当我尝试调用 servlet 时,我遇到了错误的证书错误。
在普通 IE 或 chrome 中给出的 servlet URL 给了我一个有效的响应,能够访问服务器 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)
所以,最初我在 cacerts 中检查了 CCC 服务器的证书,它拥有所有根证书,但颁发给 URL 的证书除外。
我们发现问题是在 URL 的 BIG 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 证书
所以,我为 URl 获取了 PKCS7 证书并尝试将其转换为 .cer 并尝试导入,但得到了同样的错误。
【问题讨论】:
-
请将错误范围缩小到一个简单的可重现用例(是否会在没有重定向的情况下发生?)。目前这听起来像是一台 Rube Goldberg 机器。
-
不,如果不重定向到 https,我们就无法调用 servlet。我同意您的评论,但我想知道为什么会收到错误的证书错误?
-
一些附加信息将有助于确定解决方案。当您使用浏览器访问GGG时,您使用的是IP地址还是域名? CCC访问GGG是用IP地址还是域名?
-
看起来您正在使用 IBM JRE。您是否尝试过使用 Oracle JRE 看看是否有任何不同?
-
我用域名...打服务器GGG