开发者社区> 问答> 正文

handshakefailure错误的原因及如何解决

我在服务器使用HttpClient,请求钉钉API(oapi.dingtalk.com/gettoken)。
在本地跑没有问题,在钉钉里作为微应用跑,就会出错。

错误信息:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

JAVA代码:
        String accessToken = "";
        String code = request.getParameter("code");
        logger.info("code=" + code);
        
        HttpResponse response = null;
        CloseableHttpClient httpClient = HttpClients.createDefault();
        
        // 建立连接
        List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
        parameters.add(new BasicNameValuePair("corpid", "XXXXXX"));
        parameters.add(new BasicNameValuePair("corpsecret", "XXXXXX"));
        String query = URLEncodedUtils.format(parameters, "UTF-8");
        HttpGet getRequest = new HttpGet("https://oapi.dingtalk.com/gettoken?" + query);
        // POST请求请在HTTP Header中设置 Content-Type:application/json,否则接口调用失败
        getRequest.addHeader("Content-type", "application/json");
        logger.info("url=" + getRequest.getURI().toString());
        response = httpClient.execute(getRequest);// 走到这句的时候,报错了。

在论坛里搜了搜,没有找到类似的问题,
请教是什么原因,以及如何解决?
初次提问题,不知问题描述明白了没,还望指正。

展开
收起
havequestion 2016-04-21 21:37:01 21446 0
8 条回答
写回答
取消 提交回答
  • Re:Rehandshakefailure错误的原因及如何解决
    参考10楼
    2016-04-25 11:25:19
    赞同 展开评论 打赏
  • Rehandshakefailure错误的原因及如何解决
    使用 HttpsURLConnection 可以解决。
    下边这句加上


    HttpsURLConnection.setDefaultHostnameVerifier(                     new javax.net.ssl.HostnameVerifier(){

                             public boolean verify(String hostname,
                                    javax.net.ssl.SSLSession sslSession) {                             return true ;
                            }                    });
    2016-04-24 22:30:28
    赞同 展开评论 打赏
  • Rehandshakefailure错误的原因及如何解决
    我也碰到同样的问题,也一同请教。
    2016-04-24 22:20:43
    赞同 展开评论 打赏
  • 回 4楼君信的帖子
    多谢提示,我正参照这个文章,进行测试。

    不过还是有个问题想问一下。
    1,为什么我在自己机器上,不需要配证书,就能从钉钉API取到数据;
    但是在阿里云服务器上,就必须要配证书呢?
    2,这个证书,我不在GlobalSign申请,而是使用自己生成的测试证书,是否能从钉钉API取到数据?
    (从技术角度说的话)

    -------------------------

    回 4楼君信的帖子
    你好,

    我参照你提供的文章,首先已经从globalsign申请了7天免费的证书以作验证。
    <ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.cWPUVd#q-部署阿里云ssl证书出现问题如何解决?>

    下一步就是要在负载均衡里设ssl证书,我想问的是,
    1,我现在的这种情况,负载均衡是否必须要使用?
    (我现在在阿里云上只有一台服务器)
    2,如果不在负载均衡里设定ssl,需要在哪里设定?
    需要把证明书设定到WEB服务器(Tomcat)里?

    忘赐教。
    2016-04-22 17:27:51
    赞同 展开评论 打赏
  • http://ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.cWPUVd#q-部署阿里云ssl证书出现问题如何解决?

    -------------------------

    回 7楼(havequestion) 的帖子
    你说的本地跑,和在钉钉里面作为微应用跑是什么意思?你是在微应用里面直接请求的oapi.dingtalk.com/gettoken吗
    2016-04-22 14:14:24
    赞同 展开评论 打赏
  • Rehandshakefailure错误的原因及如何解决
    我是用的服务器是阿里云服务器,不知道在服务器上需要做什么特殊设定吗?

    -------------------------

    Rehandshakefailure错误的原因及如何解决
    后续进展:

    我已经在自己服务器,配好了从globalsign拿到的证书,
    自己的web应用已经可以走https访问了,
    但是调钉钉api的时候,还是一样的错误。

    -------------------------

    回 8楼君信的帖子
    不好意思,各位,休假刚回来。
    问题没有解决,还得继续问啊。

    >你说的本地跑,和在钉钉里面作为微应用跑是什么意思?你是在微应用里面直接请求的oapi.dingtalk.com/gettoken吗

    在本地跑的意思是:在自己机器上,启动Tomcat,里面运行我的Web应用后,然后通过浏览器来请求<localhost/dingding>这个URL,
    在这个URL相对应的Java Controller里面,我要使用代码(Apache HttpClient)来调<oapi.dingtalk.com/gettoken>,
    在这种情况下,是可以取到access_token的。
    在钉钉里面作为微应用跑是什么意思:之后,我把我的Web应用部署到阿里云服务器上,
    无论是通过浏览器直接请求<aliyun_server/dingding>这个URL,
    还是把这个URL设置到钉钉的微应用里来启动,都会报handshake_failure的错误。

    -------------------------

    回 10楼z豹的帖子
    多谢提示。

    我试了一下,还是会出一样的问题。没有解决。
    不知是不是我调用的问题。

    代码如下:

        HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
            public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
               return true;
            }
        });
        HttpResponse response = null;
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 建立连接
        List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
        parameters.add(new BasicNameValuePair("corpid", "XXXXXX"));
        parameters.add(new BasicNameValuePair("corpsecret", "XXXXXX"));
        String query = URLEncodedUtils.format(parameters, "UTF-8");
        HttpGet getRequest = new HttpGet("Https://oapi.dingtalk.com/gettoken?" + query);
        // POST请求请在HTTP Header中设置 Content-Type:application/json,否则接口调用失败
        getRequest.addHeader("Content-type", "application/json");
        logger.info("url=" + getRequest.getURI().toString());
        response = httpClient.execute(getRequest);// 跑到这里报错了。





    还望提示。

    -------------------------

    Rehandshakefailure错误的原因及如何解决
    今天查来查去总算把问题解决了。

    出现这个错误的原因是,我从服务器请求是,默认的SSL协议版本和钉钉服务器端可以接受的SSL协议版本对不上,导致的。
    请求之前,加一段下面的代码,就OK了。

    另,感谢大家的帮助。

            TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
                }

                public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
                }
            } };
            // "TLSv1.2"不正确的话,会出现"Received fatal alert: handshake_failure"异常
            // Ref:logback.qos.ch/manual/usingSSL_ja.html
            SSLContext sc = SSLContext.getInstance("TLSv1.2");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sc);
            CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    2016-04-22 08:59:34
    赞同 展开评论 打赏
  • Rehandshakefailure错误的原因及如何解决
    这个API 的证书看起来没问题,默认JDK都有一个cacerts作为被信任的root 清单, 看看是不是那有问题。 不行用JDK 默认的
    2016-04-22 08:44:38
    赞同 展开评论 打赏
  • 回 楼主(havequestion) 的帖子
    这个是ssl证书的问题,亲,您是否方便私信我发下手机号,加您好友,定位下问题
    2016-04-21 23:08:03
    赞同 展开评论 打赏
滑动查看更多
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
面向失败设计 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载