为了账号安全,请及时绑定邮箱和手机立即绑定

javax.net.ssl.SSLHandshakeException:Web服务通信期间握手期间

/ 猿问

javax.net.ssl.SSLHandshakeException:Web服务通信期间握手期间

HUH函数 2019-11-15 10:41:34

我收到javax.net.ssl.SSLHandshakeException:当我尝试通过Internet对Web服务进行HTTPS发布时,握手异常期间远程主机关闭了连接。但是相同的代码可用于其他Internet托管的Web服务。我尝试了很多事情,没有任何帮助。我在这里发布了示例代码。谁能帮我解决这个问题?


public static void main(String[] args) throws Exception {


    String xmlServerURL = "https://example.com/soap/WsRouter";

    URL urlXMLServer = new URL(xmlServerURL);

    // URLConnection supports HTTPS protocol only with JDK 1.4+ 

    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(

            "xxxx.example.com", 8083));

    HttpURLConnection httpsURLConnection = (HttpURLConnection) urlXMLServer

            .openConnection(proxy);

    httpsURLConnection.setRequestProperty("Content-Type","text/xml; charset=utf-8");

    //httpsURLConnection.setDoInput(true);

    httpsURLConnection.setDoOutput(true);

    httpsURLConnection.setConnectTimeout(300000);

    //httpsURLConnection.setIgnoreProxy(false);

    httpsURLConnection.setRequestMethod("POST"); 

    //httpsURLConnection.setHostnameVerifier(DO_NOT_VERIFY); 

    // send request

    PrintWriter out = new PrintWriter(

            httpsURLConnection.getOutputStream());

    StringBuffer requestXML = new StringBuffer();

    requestXML.append(getProcessWorkOrderSOAPXML());   

    // get list of user     

    out.println(requestXML.toString()); 

    out.close();

    out.flush();

    System.out.println("XML Request POSTed to " + xmlServerURL + "\n");

    System.out.println(requestXML.toString() + "\n"); 

    //Thread.sleep(60000);  

    // read response


    BufferedReader in = new BufferedReader(new InputStreamReader( 

            httpsURLConnection.getInputStream()));

    String line;

    String respXML = "";

    while ((line = in.readLine()) != null) {

        respXML += line;

    }

    in.close();


    // output response

    respXML = URLDecoder.decode(respXML, "UTF-8"); 

    System.out.println("\nXML Response\n");

    System.out.println(respXML);

}

实际上,这里有两种情况。当我作为独立的Java程序工作时,会遇到上述异常。但是,当我尝试在weblogic应用程序服务器中执行时,出现以下异常:任何线索可能是什么原因?


查看完整描述

3 回答

?
斯蒂芬大帝

Java 7默认为TLS 1.0,如果不接受该协议,则可能导致此错误。我遇到了Tomcat应用程序和服务器将不再接受TLS 1.0连接的问题。我加了


-Dhttps.protocols=TLSv1.1,TLSv1.2

Java选项,并对其进行了修复。(Tomcat正在运行Java7。)


查看完整回答
反对 回复 2019-11-15
?
慕仰8121524

我遇到了同样的问题,并通过添加以下内容解决了该问题:


System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");

在openConnection方法之前。


查看完整回答
反对 回复 2019-11-15
?
慕莱坞7535251

还没有答案,但是评论太多了。显然这不是服务器证书问题;其症状是完全不同的。从系统的POV来看,服务器在握手期间似乎正在关闭。有两种可能性:


该服务器确实正在关闭,这是一个SSL / TLS协议违规,尽管这是一个相当小的攻击。有很多原因可能导致服务器无法与您握手,但是服务器应首先发送致命警报,您的JSSE或weblogic等效对象应指出该警报。在这种情况下,如果您能够(并被允许)与经验丰富的服务器管理员通信,则服务器日志中可能会包含一些有用的信息。或者,您可以尝试在客户端计算机上放置一台网络监视器,或者将其关闭到足够近的距离,它可以看到您的所有流量;我个人喜欢www.wireshark.org。但这通常仅显示关闭是在ClientHello之后立即进行的,并不能将范围缩小很多。您不必说是否应该为此服务器配置“客户端证书”(实际上是Java的Key&cert,形式为privatekeyEntry)。可能会认为这是一种攻击并且故意关闭协议而违反了协议,即使他们应该正式发送警报也是如此。


或者,网络中的某些中间盒(通常是防火墙或所谓的透明代理)正在决定它不喜欢您的连接并强迫关闭。您使用的代理显然是可疑的。当您说“相同的代码”适用于其他主机时,请确认您是通过同一个代理(不只是代理)并使用HTTPS(不清除HTTP)来确定的。如果不是这样,请尝试通过代理通过HTTPS对其他主机进行测试(您无需发送完整的SOAP请求,只需发送GET /即可)。如果可以,请尝试在没有代理或可能没有其他代理的情况下进行连接,然后通过代理将HTTP(非S)通过代理连接到主机(如果两者均支持clear),然后查看它们是否起作用。


如果您不介意发布实际的主机(但绝对不是任何身份验证凭据),其他人可以尝试一下。或者,您可以访问www.ssllabs.com并要求他们测试服务器(不发布结果);这将尝试SSL / TLS连接的几种常见变体,并报告所看到的任何错误以及任何安全漏洞。


查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信