java ssl使用自定义证书或忽略证书

news2024/9/21 11:14:06

1.证书错误

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

2.生成客户端证书

openssl x509 -in <(openssl s_client -connect 192.168.11.19:8101 -prexit 2>/dev/null) -out 11_19_8101.crt

       会在当前文件夹下生成11_19_8101.crt;如果是其它网址,相应的替换192.168.11.19:8101


3.证书导入到jvm

        到{jdk_home}/jre/bin下,执行下面命令,密码输入changeit,后面提示是否信任该证书,输入Y

keytool -keystore ..\lib\security\cacerts -import -alias 192.168.11.19 -file /home/11_19_8101.crt

4.验证jdk证书是否生效

         验证http请求的java

import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @description http request test
 * javac HttpTest.java
 * java HttpTest url param
 * @date 2024/08/21
 */
public class HttpTest {

    public static void main(String[] args) {
        try {
            URL url = new URL(args[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            OutputStream os = connection.getOutputStream();
            os.write(args[1].getBytes());

            InputStream is = connection.getInputStream();
            byte[] buffer = new byte[1024];
            int bytesRead = -1;
            while ((bytesRead = is.read(buffer)) != -1) {
                System.out.println("Read " + bytesRead + " bytes");
                System.out.println(new String(buffer,"UTF-8"));
            }

            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                System.out.println("http request success");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 在服务器上执行命令

javac HttpTest.java
java HttpTest https://192.168.xx.xx:6666/callback/basic {"name":"123456"}

证书问题未修正时,会报出下面问题;修正后运行将打印正常返回

5.忽略ssl证书验证 

        下面代码为忽略ssl证书错误的http请求工具类,或者仿照下面修改自己项目中的请求工具类

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Set;

/**
 * @Description: HttpUtils
 * @Author: zhanggw
 * @CreateDate: 2024/8/21
 */
public class HttpUtils {

    public static void main(String[] args) {
        String result = postIgnoreSSl(args[0], args[1], null);
        System.out.println("result:" + result);
    }

    public static String postIgnoreSSl(String uri, String params, Map<String, String> headers) {
        Reader in = null;
        try {
            URL url = new URL(uri);
            byte[] postDataBytes = params.getBytes(StandardCharsets.UTF_8);

            trustAllHttpsCertificates();

            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String urlHostName, SSLSession session) {
                    return true;
                }
            });

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
            conn.setDoOutput(true);
            conn.setConnectTimeout(1000);
            conn.setReadTimeout(1000);

            if (headers != null && !headers.isEmpty()) {
                Set<String> keys = headers.keySet();
                for (String key : keys) {
                    conn.setRequestProperty(key, headers.get(key));
                }
            }
            conn.getOutputStream().write(postDataBytes);

            int code = conn.getResponseCode();
            if (code == 200) {
                in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
            } else {
                in = new BufferedReader(new InputStreamReader(conn.getErrorStream(), StandardCharsets.UTF_8));
            }

            StringBuilder sb = new StringBuilder();
            for (int c; (c = in.read()) >= 0; ) {
                sb.append((char) c);
            }
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    private static void trustAllHttpsCertificates() throws Exception {
        javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
        javax.net.ssl.TrustManager customTrustManager = new customTrustManager();
        trustAllCerts[0] = customTrustManager;
        javax.net.ssl.SSLContext sslContext = javax.net.ssl.SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
    }

    static class customTrustManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
        @Override
        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;
        }

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

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

}

参考资料:

ssl - Java: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target - Stack Overflow

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux neo4j 切换知识图谱

neo4j 安装 linux neo4j的安装可以浏览这篇文章&#xff1a; ubuntu sudo apt-get install neo4j 配置安装与设置远程访问 引言 如果你是window用户&#xff0c;直接下载桌面版进行安装与使用即可&#xff1b; 我有一台linux的服务器&#xff0c;想部署在上面&#xff0c;不…

UE5.4内容示例(5)UI_CommonUI - 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例&#xff0c;可以用此熟悉一遍UE5的功能 UI_CommonUI可以看这个视频学习&#xff0c;此插件处于Beta状态&#xff0c;应用UI游戏方面&#xff0c;支持手柄等多输入端…

打饭-GYM

打饭 我还不信了&#xff0c;手动模拟一遍 再来了好看一点的图 ji12345a[i]21341120x3f0x3f0x3f0x3f0x3f114220x3f0x3f0x3f0x3f103520x3f0x3f0x3f0x3f9min(332,42)4020x3f0x3f0x3f8min(332,35)min(332,40)3190x3f0x3f7min(262,33)332490x3f0x3f6min(172,33)3120x3f0x3f0x3f5min…

【前端基础篇】JavaScript基础介绍

文章目录 前言初始JavaScriptJavaScript是什么发展历史JavaScript和HTML和CSS之间的关系JavaScript的运行过程JavaScript的组成 JavaScript的书写形式行内式内嵌式外部式注释 输入输出基础语法变量数据类型 运算符 JavaScript对象对象new关键字 常用对象数组创建数组数组操作函…

电影票api接口对接开发过程中需要注意什么?

电影票API接口对接过程需要考虑以下几个关键点&#xff1a; 1.了解API接口基础&#xff1a; 获取接口文档&#xff0c;理解其结构、请求方式、参数和返回数据格式。 2.接入流程&#xff1a; 使用API密钥或令牌进行身份验证。利用沙箱环境无风险测试。选择合适的编程语言实现…

Centos LVM磁盘合并方法

Centos LVM磁盘合并方法 使用fdisk -l命令查看机器增加了2块物理磁盘&#xff0c;一块40G另一块50G 需要将这两块盘的空间合并在一起&#xff0c;而且还需要动态扩展即在不关机的情况下操作 使用pvcreate将两块新增的物理磁盘加入物理卷 [rootlocalhost ~]# pvcreate /dev/sdb…

6G网络的关键技术、应用前景与挑战并存的科技征途

移动通信技术正以前所未有的速度迭代更新&#xff0c;而6G技术的研发与商用化进程渐渐成为了当前科技领域的热点与焦点。在5G技术尚未完全普及的今天&#xff0c;全球各国已纷纷将目光投向了更加充满想象的6G网络时代。本文将探讨全球6G研发的最新进展&#xff0c;特别是欧盟与…

Webots与ROS1、ROS2接口变迁-2024-

三大免费仿真器CoppeliaSim、Gazebo和Webots。 Gazebo接口总结&#xff1a; Gazebo与ROS1、ROS2接口变迁-2005-2024--CSDN博客 缺点&#xff1a;版本绑定策略 早期webots版本和ros版本绑定 后期&#xff0c;webots接口最新版本和ros特定版本最匹配。 例如&#xff1a; 最好按…

Ubuntu 中 SSH 服务的配置与原理详解

目录 1. 基本知识2. 配置步骤 1. 基本知识 一种用于在不安全的网络上安全登录和执行命令的协议 通过加密的方式保护通信数据&#xff0c;确保在传输过程中不被窃取或篡改 SSH 常用于远程登录服务器、传输文件以及执行命令 SSH 原理 公钥和私钥&#xff1a;SSH 使用公钥加密来…

UEFI 01记: 开发环境 在 ubuntu22 中搭建 edk2 开发环境并运行简单示例

https://uefi.org 1&#xff0c;预备环境 $ sudo apt install uuid-dev $ sudo apt install nasm $ sudo apt install bison flex $ sudo apt install build-essential $ sudo apt-get install x11proto-xext-dev $ sudo apt-get install libx11-dev $ sudo apt-get install l…

C语言回调函数进阶篇:全面总结与实战技巧

在C语言的编程世界中&#xff0c;回调函数是一种极其重要的概念。它提供了一种灵活的方式来编写可扩展和模块化的代码。本文将带你深入理解回调函数的原理&#xff0c;并通过一系列案例&#xff0c;系统且全面地总结回调函数的使用技巧。 一、回调函数解析 1.什么是回调函数&…

实战教程:Python实现高校爬虫,运用协同过滤与k-means算法进行专业评分分析

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

【工具】复制网页为markdown的浏览器插件

本文首发于 ❄️慕雪的寒舍 说明 如果您需要转载或者想保存他人的文章。可以使用一个油猴插件&#xff0c;快速将网站页面复制为markdown&#xff08;以下简称md&#xff09;。 只要目标网站是支持md语法&#xff08;大部分博客站点都是支持的&#xff09;那么复制下来的效果…

利用VirtualBox安装CentOS系统

博主这次用VirtualBox虚拟机安装CentOS系统。无论是大小型项目都是要发布到云主机上面&#xff0c;必然要用到Linux系统&#xff0c;有的人的本地电脑硬件配置不高&#xff0c;没有办法运行数据库集群&#xff0c;所以只能借助云主机。毕竟云主机也是Linux系统&#xff0c;大家…

程序员的日常挑战:如何在编码工作与持续学习之间找到平衡?

文章目录 每日一句正能量前言高效编码习惯与时间管理技巧高效编码习惯时间管理技巧 提升式学习的策略职业发展与个人成长的和谐共生职业发展的不同阶段及其技能要求如何在工作中寻找自我提升的学习机会分享个人成长的故事与经验 后记 每日一句正能量 黎明时怀着飞扬的心醒来&am…

Unity(2022.3.38LTS) - 2D刚体

目录 一.简介 二.组件详细介绍 2D刚体 类型介绍 三. 刚体的简单使用 一.简介 2D 物理系统为开发者提供了强大的工具来模拟和控制二维游戏中的物理行为。 A、基本概念 刚体&#xff08;Rigidbody 2D&#xff09; 刚体组件用于赋予游戏对象物理属性&#xff0c;使其能够受…

消息过期时间设置:队列属性与消息TTL

消息过期时间设置&#xff1a;队列属性与消息TTL 1. 设置队列属性2. 对消息本身进行TTL设置3. 同时使用时的TTL确定 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在消息队列&#xff08;MQ&#xff09;中&#xff0c;设置消息的过期时间是…

RISC-V全志D1多媒体套件

RISC-V全志D1多媒体套件 此开发板的任何问题都可以在我们的论坛交流讨论 https://forums.100ask.net/c/aw/d1/57 硬件简述 D1主板 以下是主板图&#xff1a; D1板载功能 板载功能有&#xff1a; XR829 WIFI蓝牙模组芯片&#xff0c;Bluetooth支持标准蓝牙与 低功耗蓝牙&a…

WPF中的可视化树(VisualTree)和逻辑树(LogicalTree)

可视化树和逻辑树 我们先来理解一下什么是可视化树和逻辑树。 可视化树&#xff1a;包含最初指定的大多数元素&#xff08;在XAML或.cs中&#xff09;以及控件模板中的元素。 通俗点来讲&#xff0c;就是整个元素的构成树&#xff0c;从最上面的结点到最后一个结点&#xff…

华为:IT系统的演进与数字时代IT系统的重新定位

往期回顾&#xff1a; 企业4A架构&#xff1a;数字化转型的底层方法论&#xff08;附TOGAF资料下载&#xff09; PPT分享&#xff1a;数据治理的方法论、设计思路与方案&#xff08;干货&#xff09; 浅谈数字化转型方法论 110页PPT:xx业务流程优化&#xff08;BPR&#xff…