javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

本身这个问题之前未找到很好的解决办法,本地请求Https请求URL时,一直没有问题,在线上服务器上时,总是出现javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure的问题,

1、开始以为双方的协议不一致,修改了协议范围后,仍然不行

复制代码
//可以打印请求过程,查询对方协议
System.setProperty("javax.net.debug", "all");

//然后可以请求前设置
System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,TLSv1.0,SSLv3");

2、后来继续查询,从java8 Update31开始,由于SSL协议中的安全漏洞,默认情况下禁用SSL v3协议,需要找到jvm下的java.security文件,路径示例:jdk/Contents/Home/jre/lib/security,

复制代码
定位参数所在行数
cat -n java.security |grep 'jdk.tls.disabledAlgorithms' 
 
直接按行数编辑(示例100行)
#vi +100 java.security
jdk.tls.disabledAlgorithms= SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves
 
删除 SSLv3, TLSv1,TLSv1.1 

以上方法使用后问题依旧存在,于是就想着跳过这个协议验证

3、于是开启了第三种方法,来个釜底抽薪,

复制代码
HttpsURLConnection connection = null;
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            connection = (HttpsURLConnection) realUrl.openConnection();
             // 创建信任所有服务器的TrustManager
              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) {
                            }
                        }
                };

           // 初始化SSLContext并设置TrustManager
           SSLContext sc = SSLContext.getInstance("SSL");
           sc.init(null, trustAllCerts, new java.security.SecureRandom());

           // 从SSLContext获取SSLSocketFactory并设置到HttpsURLConnection中
           connection.setSSLSocketFactory(sc.getSocketFactory());

            // 设置通用的请求属性
            connection.setRequestProperty("Accept-Charset", "utf-8");
            connection.setRequestProperty("contentType", "utf-8");
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("User-Agent",
                    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36");
            // 建立实际的连接
            connection.connect();
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
            String line;
            while ((line = in.readLine()) != null) {
                line = new String(line.getBytes());
                result.append(line);
            }

        } catch (Exception e) {
        
            e.printStackTrace();
        }

当然这种方法不建议使用,不安全,如有更好的方法,可以下面评论,共同学习共同进步

相关推荐
七夜zippoe3 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥3 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
Fcy6484 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满4 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
主机哥哥5 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
珠海西格电力科技6 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀6 小时前
Linux环境变量
linux·运维·服务器
zzzsde6 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
那就回到过去7 小时前
MPLS多协议标签交换
网络·网络协议·hcip·mpls·ensp
qq_297574677 小时前
Linux 服务器 Java 开发环境搭建保姆级教程
java·linux·服务器