如何解决javax.net.ssl.SSLHandshakeException:连接被对等方关闭

如何解决javax.net.ssl.SSLHandshakeException:连接被对等方关闭,java,android,ssl,ssl-certificate,tls1.2,Java,Android,Ssl,Ssl Certificate,Tls1.2,我试图使用截击发送http请求,但收到错误 javax.net.ssl.SSLHandshakeException:连接被对等方关闭 我四处搜索,尝试一些建议,但没有一个能解决我的问题。请帮忙 下面是我使用的代码 public class volley { static RequestQueue queue=null; public static String TAG = "MY_VOLLEY"; volley(final String URL,

我试图使用截击发送http请求,但收到错误

javax.net.ssl.SSLHandshakeException:连接被对等方关闭

我四处搜索,尝试一些建议,但没有一个能解决我的问题。请帮忙

下面是我使用的代码

public class volley {

    static RequestQueue queue=null;
    public static String TAG = "MY_VOLLEY";
    volley(final String URL,
           final String Text
           final Context context
    ){
        helper.log(TAG,"Started Loading");
        // Instantiate the RequestQueue.
        if(queue==null) {
           queue = Volley.newRequestQueue(context);
        }
        // Request a string response from the provided URL.
        StringRequest stringRequest = new StringRequest(
                Request.Method.POST, URL, new Response.Listener<String>()
        {
            @Override
            public void onResponse(String response) {

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

                }
                return;
            }
        }
    ){
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                try {
                    params.put("message",Text);
                    params.put("from",From);
                } catch (Exception e) {
                    helper.log(TAG, "Error, hash map failed");
                }
                return params;
            }
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("Content-Type", "application/x-www-form-urlencoded");
                return params;
            }
    };
        // Add the request to the RequestQueue.
        queue.add(stringRequest);
        return;
    }
}
公开课截击{
静态RequestQueue=null;
公共静态字符串TAG=“MY_-VOLLEY”;
截击(最终字符串URL,
最终字符串文本
最终语境
){
log(标记“已开始加载”);
//实例化RequestQueue。
if(队列==null){
queue=Volley.newRequestQueue(上下文);
}
//从提供的URL请求字符串响应。
StringRequest StringRequest=新StringRequest(
Request.Method.POST,URL,new Response.Listener()
{
@凌驾
公共void onResponse(字符串响应){
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
}
返回;
}
}
){
@凌驾
受保护的映射getParams(){
Map params=新的HashMap();
试一试{
参数put(“消息”,文本);
参数put(“from”,from);
}捕获(例外e){
log(标记“Error,hash map failed”);
}
返回参数;
}
@凌驾
公共映射getHeaders()引发AuthFailureError{
Map params=新的HashMap();
参数put(“内容类型”、“应用程序/x-www-form-urlencoded”);
返回参数;
}
};
//将请求添加到RequestQueue。
添加(stringRequest);
返回;
}
}

就调试JSSE而言,这是一件痛苦的事情

很可能握手失败,JSSE在大多数情况下只显示最后一个问题,即服务器正在关闭连接。通常情况下,服务器会在TLS警报消息中告诉您该问题,但在异常消息中不会显示该问题

如果安装了Wireshark或类似设备,最简单的方法是启动一个会话并查看TLS记录(Wireshark很好地显示了它们,因此很容易识别包含错误代码和含义的错误包)


如果您还没有这个工具,那么可以激活SSL调试并查看STDOUT上的消息。需要注意的是,如果您不熟悉TLS,那么它们就有点难以阅读。由于TLS是一种全局设置,您应该确保在没有建立其他TLS连接的情况下进行测试,否则您会得到混合输出。要启用TLS握手调试,请设置系统属性
-Djavax.net.debug=ssl:handshake

警报始终会导致包含它的异常。关闭可能意味着客户端在需要时没有提供证书,因为这不是一个警报条件。@user207421事实并非如此。我希望是这样,因为如果是这样的话,我的生活会轻松很多。我必须非常经常地支持这类问题,并且经常使用Wireshark或上述系统属性。