https请求报错:javax.net.ssl.SSLHandshakeException:Received fatal alert: unrecognized_name 的解决过程

这篇具有很好参考价值的文章主要介绍了https请求报错:javax.net.ssl.SSLHandshakeException:Received fatal alert: unrecognized_name 的解决过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

提示:本地调试正常:
项目场景:
部署到WebSphere服务器上就会报上述错误;
一度认为是WebSphere服务器上的配置有问题,经过多次偿试,最终解决问题发现和服务配置无关;
测试环境使用HttpClient发送https请求下载附件时报错:


问题描述

提示:项目地址是http,需要访问的地址是https:

因为访问https地址所以默认信任所有证书:

    /**
     * 创建 HttpClient 客户端代码
     * @return org.apache.http.impl.client.CloseableHttpClient
     * @Author xianzi
     * @CreateTime 2022/10/17 15:53
     * @Description 信任所有证书
     **/
    public static CloseableHttpClient createSSLClientDefault() {
        try {
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                // 信任所有
                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true;
                }
            }).build();
            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
            //"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"
//            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[]{"SSLv1.2"}, null, hostnameVerifier);
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        return HttpClients.createDefault();

    }

使用httpclient发送https请求下载附件时报错:

javax.net.ssl.SSLHandshakeException: Received fatal alert: unrecognized_name
at com.ibm.jsse2.i.a(i.java:31)
~[?:8.0 build 201512221
at com.ibm.jsse2.i.ali.java:43)~?:8.0 build 201512221
at com.ibm.jsse2.as.blas.java:816) -?:8.0 build 201512221
at com.ibm.jsse2.as.alas. java: 752)
~?:8.0 build 201512221
at
com.ibm.jsse2.as.i(as.java:130)
~?:8.0 build 201512221
at
com.ibm.jssez.as.a(as.java:483) ~ ?:8.0 build 201512221
com.ibm.jsse2.as.startHandshake(as.java:160)
~[?:8.0 build 201512221

附图:https请求报错:javax.net.ssl.SSLHandshakeException:Received fatal alert: unrecognized_name 的解决过程
此处看报错信息曾怀疑是服务器使用的是ibmjdk导致的错误,但是后续解决问题之后证实这个方向是错误的


原因分析:

https认证方式分为2种(单向认证、双向认证):

单向认证:

单向认证一般是指客户端确认服务端身份(也就是我常用的不安全认证模式)
上面代码也确实证实了单向认证请求https是没有问题的;

双向认证:

双向认证则是指在客户端需要确认服务端身份的同时,服务端也需要确认客户端的身份。
接下来也是我解决此错误的原因


网上搜索到的解决方案,偿试无效的有

一、设置系统属性,在启动类加上下列代码无效:

System.setProperty ("jsse.enableSNIExtension", "false");

二、在JVM启动命令中加入指令无效:
-Djsse.enableSNIExtension=false

三、将上面指令配置到tomcat中(没有偿试过)
最终也不是通过此方案解决错误

解决方案:

请求双向认证的https地址时,客户端需要初始化证书及证书版本,客户端会根据根证书生成携带公钥的子证书发服务端发送二次握手,服务端会验证客户端的请求是否合法,至此问题解决.代码如下:

    /**
     * 双向认证请求客户端创建
     * @Author xiangzi
     * @CreateTime 2022/10/17 16:29
     */
    public static CloseableHttpClient creatTwoWayHttpClient() {
        try {
            CloseableHttpClient httpclient;
            //     SSLContext ctx = SSLContexts.createSystemDefault();
            //      SSLConnectionSocketFactory fac =
            //          new SSLConnectionSocketFactory(ctx, new String[] {"TLSv1.2"}, null,
            //              SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            //      httpclient = HttpClientBuilder.create().setSSLSocketFactory(fac).build();
            SSLContext ctx = SSLContexts.custom().useProtocol("TLSv1.2").build();
            httpclient = HttpClientBuilder.create().setSslcontext(ctx).build();
//            HttpPost httpPost = new HttpPost(url);
//            CloseableHttpResponse resp = httpclient.execute(httpPost);
//            System.out.println("===SSL版本:   "+v+"测试附件test====结束"+resp.toString());
            return httpclient;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return HttpClients.createDefault();
    }

暂未实现 单向验证和双向验证请求兼容初始化客户端代码,只是在使用时加了一个参数区分;代码如下:文章来源地址https://www.toymoban.com/news/detail-446074.html

    /**
     * @param isTwoWayAuthentication true 表示发送HTTPS请求对方为双向验证域名
     * 创建 HttpClient 客户端代码
     * @return org.apache.http.impl.client.CloseableHttpClient
     * @Author xianzi
     * @CreateTime 2022/10/17 15:53
     * @Description 信任所有证书
     **/
    public static CloseableHttpClient createSSLClientDefault(Boolean isTwoWayAuthentication) {
        try {
            if (isTwoWayAuthentication) {
                return creatTwoWayHttpClient();
            }
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                // 信任所有
                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true;
                }
            }).build();
            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
            //"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"
//            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[]{"SSLv1.2"}, null, hostnameVerifier);
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        return HttpClients.createDefault();

    }

到了这里,关于https请求报错:javax.net.ssl.SSLHandshakeException:Received fatal alert: unrecognized_name 的解决过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决远程调用三方接口:javax.net.ssl.SSLHandshakeException报错

    最近在对接腾讯会议API接口,在鉴权完成后开始调用对方的接口,在此过程中出现调用报错:javax.net.ssl.SSLHandshakeException。 当你在进行https请求时,JDK中不存在三方服务的信任证书,导致出现错误javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败。

    2024年02月13日
    浏览(40)
  • 解决报错:javax.net.ssl.SSLHandshakeException: No appropriate protocol

    使用对象存储进行文件上传时报错 注:该问题只要需要用到http的都有可能出现,不是只针对对象存储 jdk 的 java.security 文件存在配置问题 1、查看当前服务器使用的 jdk 版本 命令: java -version 2、查看该jdk的安装目录 命令: find / -name java.security 这里选择通过搜索 java.security 来

    2024年01月24日
    浏览(33)
  • javax.net.ssl.SSLHandshakeException No appropriate protocol报错解决方案

    用java开发了一个简单的***发送邮件***的程序,本地运行正常,但是上传到服务器就出现报错: 方案一 [原文参考地址](javax.net.ssl.SSLHandshakeException: No appropriate protocol报错解决_蓝缘的博客-CSDN博客) ​ 1、找到jdk目录/jre/lib/security/java.security,去掉jdk.tls.disabledAlgorithm中的SSLv3、T

    2023年04月15日
    浏览(26)
  • WGCLOUD监控sqlserver报错javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10

    翻译成中文:SqlServer 服务器只接受 TLS1.0,但是客户端给的是 TLS1.2。 找到 jdk11confsecurity 下java.security 文件 1. 把 jdk.tls.disabledAlgorithms 配置项中 TLSv1 删除,这样  TLS1.0 就可以使用了。 #jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, #    DH keySize 1024, EC keySize 224, 3D

    2024年02月06日
    浏览(31)
  • Debezium报错处理系列之九十四: javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake

    研究Debezium技术遇到的各种错误解决方法系列文章传送门: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技术遇到的各种错误的解决方法

    2024年01月18日
    浏览(26)
  • javax.net.ssl.SSLHandshakeException

    解决办法升级jdk版本或者修改jdk文件 1、对于服务器来说要支持域名并且不进行ssl证书校验,需要升级到jdk1.8的201版本及以上 2、修改…JavaJDKjrelibsecurity目录下java.security文件,添加下面语句到文件内容中

    2024年02月11日
    浏览(32)
  • Macos jdk ssl javax.net.ssl.SSLHandshakeException完美解决

    报了这么一个错误 javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake 网上一大把,测试不能用,谷歌了一下,发现少配置了一个环境变量。 System.setProperty(\\\"jdk.tls.useExtendedMasterSecret\\\", \\\"false\\\");//设置环境变量 /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/security/java.se

    2024年02月13日
    浏览(48)
  • javax.net.ssl.SSLHandshakeException: No appropriate protocol

    报错: 解释代码 这是一个Spring Boot应用程序的配置文件中的一行代码,用于设置数据库连接信息。具体解释如下: spring.datasource.url :这是Spring Boot中用于配置数据源URL的属性。 jdbc:mysql://ip:3306/dbuser :这是JDBC URL,用于指定数据库的类型(MySQL)、主机地址(ip)、端口号(

    2024年02月20日
    浏览(37)
  • kettle工具连接MySQL数据库报错 Caused by: javax.net.ssl.SSLException: Received fatal alert: internal_error

            前几天为了修复MySQL数据库漏洞,项目上从5.7.41版本升级到了5.7.43,今天在使用kettle时发现数据库突然连不上了,测试连接报如下错误:            Error connecting to database: (using class org.gjt.mm.mysql.Driver) Communications link failure The last packet successfully received from the serve

    2024年02月06日
    浏览(39)
  • Java调用Azure证书错误javax.net.ssl.SSLHandshakeException

    一、背景 Azure作为微软的公有云平台,提供了非常丰富的SDK和API让开发人员可以非常方便的调用的各项服务。公司业务需要,我们需要访问Azure上注册的应用程序,需要访问https地址 https://login.microsoftonline.com/​your-​​tenant-id 。 二、错误信息 简短报错信息:javax.net.ssl.SSLHa

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包