JavaDemo——使用jks的https

news2024/11/27 15:46:20

java使用https主要就是设置下sslContext,sslContext初始化需要密钥管理器和信任管理器,密钥管理器用于管理本地证书和私钥,信任管理器用于验证远程服务器的证书,这两种管理器都需要KeyStore初始化,两种管理器可以按需只设置一种或者都设置,KeyStore就用到jks文件和密钥库密码;

另外密钥管理器还需要一个密钥密码;

demo:

http服务端:

/**
 * 2023年7月19日上午10:43:42
 */
package testHttpSSL;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.security.KeyStore;
import java.util.concurrent.Executors;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpsConfigurator;
import com.sun.net.httpserver.HttpsServer;

/**
 * @author XWF
 *
 */
public class TestHttpServerWithSSL {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String storepass = "mystorepass";	//密钥库密码
		String keypass = storepass;	//密钥密码
		try {
			KeyStore keystore = KeyStore.getInstance("jks");
			keystore.load(new FileInputStream("./testhttp.jks"), storepass.toCharArray());
			SSLContext sslContext = SSLContext.getInstance("TLS");
			KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");	//管理本地证书和私钥
			kmf.init(keystore, keypass.toCharArray() );
			TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");	//验证远程服务器证书
			tmf.init(keystore);
			sslContext.init(kmf.getKeyManagers(), null, null);
			System.out.println(keystore);
			
			HttpsServer server = HttpsServer.create(new InetSocketAddress(4444), 0);
			server.setHttpsConfigurator(new HttpsConfigurator(sslContext));	//设置ssl
			server.createContext("/", new HttpHandler(){

				@Override
				public void handle(HttpExchange exchange) throws IOException {
					String exchangeUrl = exchange.getRequestURI().toString().substring(1);
					System.out.println("exchangeUrl=" + exchangeUrl);
					System.out.println("BODY:" + new String(exchange.getRequestBody().readAllBytes()));
					exchange.sendResponseHeaders(200, 0);
					try(OutputStream os = exchange.getResponseBody()){
						os.write("test return".getBytes());
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				
			});
			server.setExecutor(Executors.newCachedThreadPool());
			server.start();
			System.out.println("https server start");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

http客户端:

/**
 * 2023年7月19日上午10:43:58
 */
package testHttpSSL;

import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpClient.Version;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.security.KeyStore;
import java.time.Duration;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;

/**
 * @author XWF
 *
 */
public class TestHttpClientWithSSL {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String storepass = "mystorepass";
		String keypass = storepass;
		try {
			KeyStore keystore = KeyStore.getInstance("jks");
			keystore.load(new FileInputStream("./testhttp.jks"), storepass.toCharArray());
			SSLContext sslContext = SSLContext.getInstance("TLS");
			KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
			kmf.init(keystore, keypass.toCharArray() );
			TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
			tmf.init(keystore);
			sslContext.init(null, tmf.getTrustManagers(), null);
			System.out.println(keystore);
			
			HttpClient client = HttpClient.newBuilder()	//jdk11的httpclient
					.version(Version.HTTP_1_1)
					.sslContext(sslContext)	//设置ssl
					.build();
			HttpRequest request = HttpRequest.newBuilder()
					.uri(URI.create("https://127.0.0.1:4444/test?x=1&y=2"))
					.timeout(Duration.ofMillis(1000))
					.POST(BodyPublishers.ofByteArray("hello world".getBytes()))
					.build();
			HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
			System.out.println(response.statusCode());
			System.out.println(response.body().toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

运行结果:

客户端:

服务端:

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

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

相关文章

OS1_进程与线程的管理

序言 1.OS以进程、线程的方式在CPU中执行静态保存在外存(内存)中的程序&#xff0c;进程的构成与状态转化&#xff0c;特别是进程的切换&#xff1b; 2.当有多个进程处于就绪态&#xff0c;有哪些常见的挑选以执行方式&#xff1b; 3.并发执行(乱序发射)的进程&#xff0c;共享…

商品信息管理-亿发商品进销存管理系统,批发行业零售门店免费试用

众所周知&#xff0c;批发零售行业面临着商品品类繁多、品牌众多、商品信息量庞大等挑战。同时&#xff0c;商品售价波动频繁&#xff0c;还需要管理商品批次&#xff0c;避免积压过期。针对这些传统批发零售行业的管理难题&#xff0c;加快行业数字化转型成为解决之道&#xf…

远程访问不了虚拟机【bug】

远程访问不了虚拟机【bug】 bug 虚拟机访问不了他的默认网关 虚拟机IP&#xff1a;172.25.254.250 虚拟机网关IP&#xff1a;172.25.254.1 远程登录也是超时的 错误产生 我还原了一下虚拟机的网络配置选项 导致 √ 使用本地DHCPT服务将IP地址给虚拟机 相关资源 本机的I…

基于Labelstudio的UIE半监督智能标注方案(本地版)

自然语言处理信息抽取智能标注方案包括以下几种&#xff1a; 基于规则的标注方案&#xff1a;通过编写一系列规则来识别文本中的实体、关系等信息&#xff0c;并将其标注。 基于规则的标注方案是一种传统的方法&#xff0c;它需要人工编写规则来识别文本中的实体、关系等信息&a…

Redis入门(1)——Redis是啥 安装Docker的Redis Redis的基本数据类型+常用命令 SpringBoot整合Redis初步

目录 引出MySQL数据库&#xff1a;慢Redis是啥&#xff1f;问题&#xff1a;redis是单线程的&#xff0c;为什么会非常快&#xff1f; 安装Redis的docker1.搜索docker search redis2.拉取docker pull redis3.运行容器4.进入容器-->进入redis redis的基本数据类型字符串(stri…

在线招投标系统nodejs+vue

本站是一个B/S模式系统&#xff0c;采用vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得在线招投标系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出…

PHP反序列化漏洞之面向对象基础

一、PHP面向对象基础 要谈PHP反序列化&#xff0c;不得不涉及面向对象&#xff0c;因为在反序列化漏洞利用中&#xff0c;大多涉及的都是“对象”的反序列化。所以需要了解面向对象基础。 面向面向对象是一种以“对象”为中心的编程思想&#xff0c;把要解决的问题分解成各个…

WORD模板如何自定义并使用?

文章目录 0.引言1.新建WORD2.WORD另存为模板3.使用模板 0.引言 使用Word模板可以提高文档处理的一致性、效率和专业性&#xff0c;同时也方便了更新和维护。对于需要频繁创建或修改文档的组织或个人来说&#xff0c;使用Word模板是一个非常实用的工具。本文总结Word模板自定义并…

Docker数据管理和镜像创建

Docker数据管理和镜像创建 一、Docker的数据管理1、数据卷2、数据卷容器3、端口映射4、容器互联&#xff08;使用centos镜像&#xff09; 二、Docker 镜像的创建1、基于现有镜像创建2、基于本地模板创建3、基于Dockerfile创建3.1 联合文件系统&#xff08;UnionFS&#xff09;3…

Docker 的前世今生

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

19 数组静态初始化练习

语法&#xff1a; 数据类型[ ] 数组名称 {元素1&#xff0c;元素2&#xff0c;元素3}; public class Demo1 {public static void main(String[] args) {int[] arr {0,1,2,3};System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.pri…

线性链表的实现

线性链表简介 线性表的链式存储结构称为线性链表&#xff0c;如图1所示&#xff0c;线性链表将存储空间划分成若干的小块&#xff0c;每块占用若干个字节&#xff0c;这些小块称为存储结点。将其中的存储结点分为两个部分&#xff0c;一部分用于存储数据元素的值&#xff0c;称…

vue中如何通过webpack-bundle-analyzer打包分析工具进行配置优化

vue中随着项目的不断功能迭代和开发&#xff0c;项目文件越来越多&#xff0c;项目的打包文件也越来越大。如何对打包文件进行分析优化&#xff0c;减小打包文件大小呢&#xff1f;可以通过webpack-bundle-analyzer 这个打包分析工具进行解决。 1、webpack-bundle-analyzer的安…

传输层协议 TCP与UDP

目录 传输层端口号端口号范围划分 0-65535认识知名端口号(Well-Know Port Number)netstatpidofxargs UDP协议UDP协议段格式UDP的特点面向数据报UDP的缓冲区基于UDP的应用层协议 TCP协议TCP协议段格式确认应答(ACK)机制超时重传机制连接管理机制&#xff1a;tcp的三次握手和四次…

自然语言处理基础详解入门

1、自然语言的概念 自然语言是指人类社会约定俗成的&#xff0c;并且区别于人工语言&#xff08;如计算机程序&#xff09;的语言&#xff0c;&#xff0c;是自然而然的随着人类社会发展演变而来的语言&#xff0c;它是人类学习生活的重要工具。 2、自然语言处理概述 自然语言…

Kubernetes对象深入学习之四:对象属性编码实战

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习》系列的第四篇&#xff0c;前面咱们读源码和文档&#xff0c;从理论上学习了kubernetes的对象相关的知识&#xff…

【算法基础:搜索与图论】3.6 二分图(染色法判定二分图匈牙利算法)

文章目录 二分图介绍染色法判定二分图例题&#xff1a;860. 染色法判定二分图 匈牙利匹配二分图最大匹配匈牙利匹配算法思想例题&#xff1a;861. 二分图的最大匹配 二分图介绍 https://oi-wiki.org/graph/bi-graph/ 二分图是图论中的一个概念&#xff0c;它的所有节点可以被…

群组变量选择、组惩罚group lasso套索模型预测新生儿出生体重风险因素数据和交叉验证、可视化...

原文链接&#xff1a;http://tecdat.cn/?p25158 本文介绍具有分组惩罚的线性回归、GLM和Cox回归模型的正则化路径。这包括组选择方法&#xff0c;如组lasso套索、组MCP和组SCAD&#xff0c;以及双级选择方法&#xff0c;如组指数lasso、组MCP&#xff08;点击文末“阅读原文”…

htmlCSS-----背景样式

目录 前言&#xff1a; 背景样式 1.背景颜色 background-color 2.背景图片 background-image 背景的权重比较 代码示例&#xff1a; 前言&#xff1a; 很久没写文章了&#xff0c;会不会想我呢&#xff01;今天我们开始学习html和CSS的背景样式以及文字样式&#xff…

井川里予是谁呢?是中国人,还是日本人?

井川里予是抖音上的一个网红&#xff0c;名字叫庞欣然。 井川里予不是日本人&#xff0c;她是地地道道的中国人。 井川里予2001年6月出生于浙江省杭州市&#xff0c;现在在广东湛江发展。她毕业于浙江经济职业技术学院&#xff0c;抖音女网红&#xff0c;粉丝高达一千多万&…