Java系统多个JSSE认证

2023-10-30

问题描述:

由于项目需要,系统需要多个JSSE认证(登录使用SSL、邮件收取)


解决办法:


一、对于需要一次JSSE认证来说,可以通过


1、InstallCert工具来安装证书

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;

public class InstallCert {

	public static void main(String[] args) throws Exception {
		String host;
		int port;
		char[] passphrase;
		if ((args.length == 1) || (args.length == 2)) {
			String[] c = args[0].split(":");
			host = c[0];
			port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
			String p = (args.length == 1) ? "changeit" : args[1];
			passphrase = p.toCharArray();
		} else {
			System.out
					.println("Usage: java InstallCert <host>[:port] [passphrase]");
			return;
		}

		File file = new File("jssecacerts");
		if (file.isFile() == false) {
			char SEP = File.separatorChar;
			File dir = new File(System.getProperty("java.home") + SEP + "lib"
					+ SEP + "security");
			file = new File(dir, "jssecacerts");
			if (file.isFile() == false) {
				file = new File(dir, "cacerts");
			}
		}
		System.out.println("Loading KeyStore " + file + "...");
		InputStream in = new FileInputStream(file);
		KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
		ks.load(in, passphrase);
		in.close();

		SSLContext context = SSLContext.getInstance("TLS");
		TrustManagerFactory tmf = TrustManagerFactory
				.getInstance(TrustManagerFactory.getDefaultAlgorithm());
		tmf.init(ks);
		X509TrustManager defaultTrustManager = (X509TrustManager) tmf
				.getTrustManagers()[0];
		SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
		context.init(null, new TrustManager[] { tm }, null);
		SSLSocketFactory factory = context.getSocketFactory();

		System.out
				.println("Opening connection to " + host + ":" + port + "...");
		SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
		socket.setSoTimeout(10000);
		try {
			System.out.println("Starting SSL handshake...");
			socket.startHandshake();
			socket.close();
			System.out.println();
			System.out.println("No errors, certificate is already trusted");
		} catch (SSLException e) {
			System.out.println();
			e.printStackTrace(System.out);
		}

		X509Certificate[] chain = tm.chain;
		if (chain == null) {
			System.out.println("Could not obtain server certificate chain");
			return;
		}

		BufferedReader reader = new BufferedReader(new InputStreamReader(
				System.in));

		System.out.println();
		System.out.println("Server sent " + chain.length + " certificate(s):");
		System.out.println();
		MessageDigest sha1 = MessageDigest.getInstance("SHA1");
		MessageDigest md5 = MessageDigest.getInstance("MD5");
		for (int i = 0; i < chain.length; i++) {
			X509Certificate cert = chain[i];
			System.out.println(" " + (i + 1) + " Subject "
					+ cert.getSubjectDN());
			System.out.println("   Issuer  " + cert.getIssuerDN());
			sha1.update(cert.getEncoded());
			System.out.println("   sha1    " + toHexString(sha1.digest()));
			md5.update(cert.getEncoded());
			System.out.println("   md5     " + toHexString(md5.digest()));
			System.out.println();
		}

		System.out
				.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
		String line = reader.readLine().trim();
		int k;
		try {
			k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
		} catch (NumberFormatException e) {
			System.out.println("KeyStore not changed");
			return;
		}

		X509Certificate cert = chain[k];
		String alias = host + "-" + (k + 1);
		ks.setCertificateEntry(alias, cert);

		OutputStream out = new FileOutputStream("jssecacerts");
		ks.store(out, passphrase);
		out.close();

		System.out.println();
		System.out.println(cert);
		System.out.println();
		System.out
				.println("Added certificate to keystore 'jssecacerts' using alias '"
						+ alias + "'");
	}

	private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

	private static String toHexString(byte[] bytes) {
		StringBuilder sb = new StringBuilder(bytes.length * 3);
		for (int b : bytes) {
			b &= 0xff;
			sb.append(HEXDIGITS[b >> 4]);
			sb.append(HEXDIGITS[b & 15]);
			sb.append(' ');
		}
		return sb.toString();
	}

	private static class SavingTrustManager implements X509TrustManager {

		private final X509TrustManager tm;
		private X509Certificate[] chain;

		SavingTrustManager(X509TrustManager tm) {
			this.tm = tm;
		}

		public X509Certificate[] getAcceptedIssuers() {
			throw new UnsupportedOperationException();
		}

		public void checkClientTrusted(X509Certificate[] chain, String authType)
				throws CertificateException {
			throw new UnsupportedOperationException();
		}

		public void checkServerTrusted(X509Certificate[] chain, String authType)
				throws CertificateException {
			this.chain = chain;
			tm.checkServerTrusted(chain, authType);
		}
	}

}


命令:

java InstallCert test.domain

如果需要指定端口使用命令:

java InstallCert test.domain:443

将会生成jssecacerts文件


2、也可以先保存证书(比如mail.cer)到本地,然后使用keytool命令来管理密钥和证书,命令:

keytool -import -trustcacerts -alias test.domain -file D:/mail.cer -keystore  "jssecacerts"  
会生成 jssecacerts文件
然后将生成的jssecacerts文件放入  JAVA_HOME\jre\lib\security目录
认证完成!!!

二、对于需要多次JSSE认证来说

比如登录使用https需要一次认证,收取邮件需要一次认证。
可以先用InstallCert生成https登录需要的 jssecacerts文件,然后使用keytool命令生成最终的jssecacerts文件(-file 参数指定第一次生成的jssecacerts文件)
或者执行两次keytool命令(第二次要使用第一次生成的jssecacerts文件)
最后将生成的jssecacerts文件放入 JAVA_HOME\jre\lib\security目录
认证完成!!!



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java系统多个JSSE认证 的相关文章

  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • Perl LWP GET 或 POST 到 SNI SSL URL

    我有一个使用 perl LWP 向客户发送数据的系统 他们可以选择 URL 以及是 POST 还是 GET 一位新客户最近抱怨该服务不起作用 他们怀疑这是因为他们的端点使用了 SNI SSL 查看日志 我看到的只是错误消息 证书验证失败 5
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • 离散变量可不可以做方差分析_R笔记:单因素方差分析

    转自个人微信公众号 Memo Cleon 的统计学习笔记 R笔记 单因素方差分析 事后两两多重比较 趋势方差分析 示例来源 李康 贺佳等 医学统计学 第6版 北京 人民卫生出版社 2013 评价某药物耐受性及安全性的I期临床实验中 将符合纳
  • 【Flask】项目部署到Flask服务器

    前言 最近刚学习FLask服务器 是一个Python的服务器框架 适用于中小型的项目 而上一期的Django服务器适用于部署大型项目 前端 创建前端的过程和上一篇博客一样 这次的项目名称为demo 界面演示 后端 创建文件夹DemoServ
  • Python 北京房价预测实验报告 深度学习 tensorflow keras

    代码 计算机课程设计北京房价预测数据集和代码实现 机器学习文档类资源 CSDN文库 前言 随着经济的不断发展和社会资源的集中 人们出现了向大城市集中的趋势 其中 北京作为我国的首都 吸引人才的能力在中国和世界都具有较强的竞争力 与此同时 每
  • 表达式引擎Aviator基本介绍及使用以及基于Aviator的规则引擎(附代码详细介绍)

    1 Aviator 1 1 什么是Aviator Aviator是一门高性能 轻量级的Java语言实现的表达式求值引擎 主要用于表达式的动态求值 1 2 为什么需要Aviator Aviator的设计目标是 轻量级 和 高性能 相对于Gro
  • JS构造函数继承---------直接继承父构造函数的prototype

    理解prototype继承之前先理解prototype proto constructor function Objfather this role 父亲 console log Objfather prototype Objfather
  • 【原创】oracle的tpc-c测试及方法

    大家好 很高兴来到博客园分享自己的所见所得 希望和大家多多交流 共同进步 本文重点在于简介使用BenchmarkSQL对oracle进行tpcc的测试步骤 只是一个简单入门的过程 开源测试工具 BenchmarkSQL 平台 windows
  • c++ strncmp及strcmp实现

    int strcmp m const char s1 const char s2 assert s1 NULL s2 NULL while s1 0 s2 0 字符串前面部分都相同 if s1 s2 gt 0 return 1 if s1
  • 2022最新版-李宏毅机器学习深度学习课程-P3深度学习基本概念

    一 如何表示更复杂的模型 单变量 上述的 y wx b线性模型x和y的关系是一条直线 即使改变w和b的值 即改变线性模型的斜率和与y轴的交叉点位置 仅仅代表y的值与x的值成正比 永远无法拟合更复杂的关系 因此我们需要一个更复杂的 更有弹性的
  • 第六章 传统金融行业的区块链战略

    一 银行的区块链战略 一 高盛 高 盛集团 Goldman Sachs 是一家国际领先的投资银行 向全球提供广泛的投资 咨询和金融服务 拥有大量的多行业客户 包括私营公司 金融企业 政府机构以及个人 高盛 集团成立于1869年 是世界上历史
  • nuxt3 window is not defined错误

    问题 在 nuxt 中直接使用 window document 会报 ReferenceError window is not defined 原因 原因其实也比较简单 由于 nextjs 是服务端渲染 它会预渲染页面后生成 HTML 然后
  • Android ViewBinding更新,include得到优化

    前言 之前的ViewBinding对include很不友好 以至于用起来很是难受 到目前优化后不再强制转换FrameLayout布局 使用更加舒适 解决 用之前的例子 直接上代码 这次我们给include的xml加上id
  • 如何终止或杀死进程

    中止进程 一个进程在任务完成之后 将会自动结束 如果要中途中止该进程的话 有两种方法 1 对于在前台运行的程序 直接通过组合键 Ctrl C 来中止 2 对于在后台运行的程序 则需要找到它的进程号 然后使用 kill 命令结束该进程 可以使
  • Java并发编程实战——java内存模型(JMM)和重排序数据依赖性规则

    文章目录 JMM的介绍 内存模型抽象结构 JMM抽象结构模型 重排序的数据依赖性 happens before规则 内存屏障 volatile语义中的内存屏障 final语义中的内存屏障 JMM的介绍 当多个线程访问同一个对象时 如果不用考
  • 自动化测试相关

    bug的风险等级 建议 一般 严重 致命 bug的生命周期 新建 待修复 审核 关闭 注意 bug关闭后可能会再次打开 测试人员关闭一个bug后需要做回归测试 验证次bug是否会引入新的bug 如果没有 则代表该bug彻底关闭 软件测试的流
  • Basic Level 1003 我要通过! (20分)

    题目 答案正确 是自动判题系统给出的最令 人欢喜的回复 本题属于PAT的 答案正确 大派送 只要读入的字符 满足下列 条件 系统就输出 答案正确 否则输出 答案错误 得到 答案正确 的条件是 1 字符 中必须仅有P A T这三种字符 可以包
  • 【已解决】mysqld: File ‘.\杩滅▼浼氳瘖-鐥呯悊绉?slow.log‘ not found (Errcode: 2 - No such file or directory)

    卸载mysql 删除和mysql相关的文件 MySQL踩坑 含泪填完 MySQL踩坑 含泪填完 1 控制面板 删除之前安装失败的mysql对应的版本 2 删除C Program Files x86 MySQL下的文件夹 见下图 3 显示隐藏
  • 懒汉式之并发安全问题

    在高并发场景下的懒汉式创建对象 造成ID重复创建 代码见下图 并发场景下 iDCreator对象并未随类的创建而创建 而是在需要的时候进行创建 导致垃圾回收器可以对其进行回收 从而有可能同一时间戳 前后两次的对象不一致 造成出现两个不同的i
  • redis 主从配置参数详解

    转 https www cnblogs com chenmh p 5121849 html undefined 安装redis 下载redis wget http download redis io releases redis 3 0 7
  • 基于51单片机的温控风扇设计

    作者 何朋伟 19计科一班 宏定义 define uchar unsigned char define uint unsigned int 包含头文件 include
  • Java系统多个JSSE认证

    问题描述 由于项目需要 系统需要多个JSSE认证 登录使用SSL 邮件收取 解决办法 一 对于需要一次JSSE认证来说 可以通过 1 InstallCert工具来安装证书 Copyright 2006 Sun Microsystems In