Java如何使用SSLContext请求https链接

 更新时间:2024年01月23日 10:14:13   作者:大魔王King  
这篇文章主要介绍了Java如何使用SSLContext请求https链接问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

使用SSLContext请求https链接

先了解几个关键类

  • SSLContext 安全套接字协议的实现核心类
  • SSLSocket 扩展自Socket用户客户端
  • SSLSocketFactory 工厂类
  • SSLServerSocket 扩展自ServerSocket用于服务端
  • SSLServerSocketFactory SSLServerSocket的工厂
  • KeyStore 密钥证书
  • KeyManager 密钥管理器
  • TrustManager 信任管理器
  • X590TrustedManager TrustManager的子接口,管理X509证书,验证远程链接

核心代码

如下:

    //首先自己实现信任管理器类,创建一个X509TrustManager对象
    X509TrustManager x509m = new X509TrustManager() {  
    	//返回受信任的X509证书数组
        @Override  
        public X509Certificate[] getAcceptedIssuers() {  
            return null;  
        }  
        //检查服务器的证书,若不信任该证书抛出异常,可以不检查默认都信任
        @Override  
        public void checkServerTrusted(X509Certificate[] chain,  
                String authType) throws CertificateException {  
        }  
   	    //检查客户端证书,若不信任该证书抛出异常,咱们自己就是客户端不用检查
        @Override  
        public void checkClientTrusted(X509Certificate[] chain,  
                String authType) throws CertificateException {  
        }  
    };  
    // 获取一个SSLContext实例,核心对象  
    SSLContext s = SSLContext.getInstance("SSL");  
    // 初始化SSLContext.init(可以导入的证书,信任管理器,SecureRandom) 三个参数都可为null,没有证书填写null就行
    s.init(null, new TrustManager[] { x509m },   new java.security.SecureRandom());
    //获取SSLSocket 用于通信
    SSLSocketFactory factory = s.getSocketFactory();
    SSLSocket s = (SSLSocket) factory.createSocket("localhost", port);
    //获取输入输出流
    OutputStream output = s.getOutputStream(); 
    InputStream input = s.getInputStream(); 
    //发送数据
    DataOutputStream out = new DataOutputStream(output);
    out.writeBytes("测试发送数据");
    out.flush();
    out.close();
    //接收数据
    Reader reader = new InputStreamReader(input, "UTF-8");
    BufferedReader bufferedReader = new BufferedReader(reader);
    String str = null;
    StringBuffer sb = new StringBuffer();
    while ((str = bufferedReader.readLine()) != null) {
        sb.append(str);
    }
    reader.close();
    System.out.println(sb.toString()); //打印返回的数据
    

这就是Java最原始的使用SSLContext创建SSLSocket发送https请求。

如果使用框架如okhttp httpclient 底层已经实现https请求,CA机构颁发的证书或者权威机构颁发的证书都是直接信任的 直接使用即可不需要再重写任何代码,网上的好多文章说的都有点问题,我已经亲测可用,对于自己生成的证书的https服务才需要另外配置SSLContext这套代码。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springmvc 4.x利用@ResponseBody返回Json数据的方法

    Springmvc 4.x利用@ResponseBody返回Json数据的方法

    这篇文章主要介绍了Springmvc 4.x利用@ResponseBody返回Json数据的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 详解MyBatis的动态SQL实现原理

    详解MyBatis的动态SQL实现原理

    MyBatis提供了强大的动态SQL语句生成功能,以应对复杂的业务场景,本篇文章将结合MyBatis解析SQL语句的过程对MyBatis中对<if>,<where>,<foreach>等动态SQL标签的支持进行分析,需要的朋友可以参考下
    2023-07-07
  • Java生成及校验token的实践

    Java生成及校验token的实践

    Token 的生成和校验机制为应用程序提供了一种安全的身份验证和授权方式,可以用于用户认证、API 访问控制等场景,本文主要介绍了Java生成及校验token的实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • 如何使用Java在excel单元格中设置超链接

    如何使用Java在excel单元格中设置超链接

    这篇文章主要介绍了如何使用Java在excel单元格中设置超链接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

    JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

    本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有一定的参考价值,需要的朋友可以参考下
    2025-03-03
  • 浅谈servlet与jsp的关系

    浅谈servlet与jsp的关系

    本文主要介绍了servlet与jsp的相关知识,并总结出servlet与jsp之间的关系,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 关于@ResponseBody 默认输出的误区的解答

    关于@ResponseBody 默认输出的误区的解答

    这篇文章主要介绍了关于@ResponseBody 默认输出的误区的解答,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 基于Java Socket实现一个简易在线聊天功能(一)

    基于Java Socket实现一个简易在线聊天功能(一)

    这篇文章主要给大家介绍基于Java Socket实现一个简易在线聊天功能(一),分为客户端和服务端两段代码,非常具有参考价值,感兴趣的朋友一起学习吧
    2016-05-05
  • java之scan.next()与scan.nextline()函数的使用及区别

    java之scan.next()与scan.nextline()函数的使用及区别

    这篇文章主要介绍了java之scan.next()与scan.nextline()函数的使用及区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • java实现邮件发送

    java实现邮件发送

    这篇文章主要为大家详细介绍了java实现邮件发送,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04

最新评论