Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 181757|回复: 0

https 请求webServic 产生的安全证书问题 jdk版本导致的Received fatal alert: protocol_version异常

[复制链接]
  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 745 天

    [LV.9]以坛为家II

    2041

    主题

    2099

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    704660
    发表于 2021-4-4 17:00:34 | 显示全部楼层 |阅读模式

    以下是我在开发中 用https去请求webService服务因为jdk版本产生的异常信息:

    在本机的环境是jdk1.8 使用axis.client发送https请求正常,但是放在服务器上jdk版本是1.7 就会产生以下问题:经过一天的请教,终于解决:

    http://xml.apache.org/axis/}stackTrace:javax.net.ssl.SSLException: Received fatal alert: protocol_version
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1979)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1086)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
    at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:186)
    at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
    at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
    at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at util.CxfClient.test2(CxfClient.java:83)
    at util.CxfClient.main(CxfClient.java:59)

    {http://xml.apache.org/axis/}hostname:WIN7-038

    javax.net.ssl.SSLException: Received fatal alert: protocol_version
    at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
    at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:154)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at util.CxfClient.test2(CxfClient.java:83)
    at util.CxfClient.main(CxfClient.java:59)
    Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1979)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1086)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
    at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:186)
    at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
    at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
    at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
    ... 11 more

     

    方法一: 将项目的jdk版本改成1.8可以解决此问题

    方法二:调用方法 让所有请求都是安全的内容如下:

     

    /**
    * 调用第三方服务方法
    * @param params :请求参数(注意:Map的key是对方接受参数的String)
    * @param url :请求地址
    * @param qNameUrl :名称域地址
    * @param mothed :请求方法
    * @param key :对方提供的appid与appsecret
    * @return :返回字符串
    * @throws KeyManagementException
    * @throws NoSuchAlgorithmException
    * @throws ServiceException
    * @throws MalformedURLException
    * @throws RemoteException
    */
    //"https://134.175.33.111/hzs/webservice/Greeting?wsdl" "http://server.sl.com/"
    public static String requestClient (Map<String,Object> params, String url, String qNameUrl, String mothed,String key) throws KeyManagementException,   NoSuchAlgorithmException, ServiceException, MalformedURLException, RemoteException{
      logger.info("\n进入请求第三方服务的公共方法,请求参数为:"+params+",请求的地址为:"+url+",请求方法为:"+mothed);

      String result = "";
      javax.net.ssl.TrustManager [] truset = new javax.net.ssl.TrustManager[1];
      javax.net.ssl.TrustManager tm = new miTM();
      truset[0] = tm;

      SSLContext context = SSLContext.getInstance("TLSv1.2");
      context.init(null, truset, null);
      SSLContext.setDefault(context);

      Service service = new Service();
      Call call = null;

      List<Object> object = new ArrayList<Object>();
      //获取连接
      call = (Call) service.createCall();
      call.setTargetEndpointAddress(new java.net.URL(url));
      call.setOperationName(new QName(qNameUrl, mothed));
      for(Entry<String, Object> entry : params.entrySet() ){
      call.addParameter(entry.getKey(), org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
      object.add(entry.getValue());
    }
      object.add(key);
      call.addParameter("key", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
      call.setReturnType(org.apache.axis.Constants.XSD_STRING);
      result = (String) call.invoke(object.toArray());

      return result;

    }

    /**
    * 设置所有的请求都是安全的
    *
    */
    static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
      return null;
    }

    public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {
      return true;
    }

    public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {
      return true;
    }

    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
    throws java.security.cert.CertificateException {
      return;
    }

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-3-29 07:12 , Processed in 0.079445 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表