JDK生成SSL认证文件及加密解析方法

jdk11高版本访问https报ssl认证异常 将 jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, ...替换为 jdk.tls.disabledAlgorithms=SSLv3, RC4...jdk -> conf -> security ->java.security文件。方案二:代码实现(添加证书信任认证)(删除SSLv3,TLSv1)原因:远程服务认证失败。方案一:修改jdk配置。 阅读详情

PS:第一次这么投入的搞个东西搞到这么晚

记录一下:

背景:因为工作中涉及到这样的一个场景,A方希望调用B方的页面,并且传递一些参数过来,如果直接在url后面添加的话,显得不安全,因此希望通过一个加密协议来进行互相认证,于是提到了RSA非对称加密及证书认证


我大改理解思路: 首先是A生成一个公钥和私钥,自己保留私钥,将公钥给对方系统B,而证书里面正是这个公钥

不知道对不对  。。。。 


然后我查了下资料,最简单的生成这样的一对公钥和私钥的方法,使用JDK生成SSL证书

步骤:

CMD 进入jdk目录
1.使用keytool命令生成证书:


输入命令 :
keytool -genkey -alias test -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore E:/dongjinlong/笔记/test.keystore -storepass 123456

填写内容:这个貌似没啥要求


参数解析:



keytool  bin下的keytool.exe


-genkey 


-alias test(别名) 


-keypass 123456(别名密码) 


-keyalg RSA(算法) 


-keysize 1024(密钥长度) 


-validity 365(有效期,天单位) 


-keystore E:/dongjinlong/笔记/test.keystore(指定生成证书的位置和证书名称) 


-storepass 123456(获取keystore信息的密码)

2.在目录下可以找到test.keystore 文件
cmd中输入 keytool -list -v -keystore E:/dongjinlong/笔记/test.keystore -storepass 123456  可以查看

3.由keystore 生成一个证书cer文件

keytool -keystore E:/dongjinlong/笔记/test.keystore -export -alias test -file  E:/dongjinlong/笔记/server.cer


重点:怎么在java代码中使用这两个文件进行加密解密呢

1. 将生成的文件放入到config目录下

2.引入commons-codec-1.10.jar 包



3.测试代码

package 加密证书;


import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;


import org.apache.commons.codec.binary.Base64;
/**
 * 1.先使用CMD 命令使用jdk 的keytool 生成 .keystore文件
 * 2.再由.keystore 文件生成对应的.cer文件
 * 3.将这两个文件导入的config目录下
 * @author 瓜宝
 *
 */
public class Cer {
/**
*  私钥加密的数据与证书解密的数据对比
* 
* @param requestParam 签名的数据 
* 格式String requestParam = "name1=value1&name2=value2&name3=value3";
* 
* @param signParam已签名的数据
* @param cer 证书名称
* @return
*/
public static boolean verifyRSAMessageByPublic(String requestParam, String signParam, String cer) {
if (requestParam == null)
return false;
PublicKey pk = null;
InputStream in = null;
try {
/* 得到X.509证书的工厂类 */
CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509");
/* 加载源文件夹下的.cer证书 参数 cer 为文件名称 server.cer */
in = Thread.currentThread().getContextClassLoader().getResourceAsStream(cer);
X509Certificate Cert = (X509Certificate) certificatefactory.generateCertificate(in);
pk = Cert.getPublicKey();
in.close();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (null != in) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}


boolean bln = false;
try {
/*RSA解密*/
Signature dsa = Signature.getInstance("SHA1withRSA");
dsa.initVerify(pk);
dsa.update(requestParam.getBytes());
Base64 base64Decoder = new Base64();
//替换回不能通过GET方式传递的字符
signParam = replaceFromUrl(signParam);
bln = dsa.verify(base64Decoder.decode(signParam.getBytes()));
} catch (Exception e) {
e.printStackTrace();
}
return bln;
}
/**
* 测试的main方法
* @param args
*/
public static void main(String[] args) {


// 加密数据
Map<String, String> map = new HashMap<String, String>();
map.put("clientNo", "000938873761");
map.put("type", "XT");
map.put("url", "/res/index.html?_viewType=2&#orderManager/index/membership");
map.put("timestamp", "2017-09-01 13:50:16");
map.put("signdata",
"aSk4FOLpEzZdHEQaL5Se7MH%2F6MMWI5Dv2APU6LuexWgZJMpFTbLpYYpBTahGTq3ZB1RNvDEQ1mlCjYC%2F0yvfVgls3ElXyL44aQdiPKKscpQdn%2FUbBDJbVMaWllekmoTvldzscV%2BNrD3wi9IAao2NnDp9K%2BzOWGHHYVjcPlSCvnw%3D");

StringBuffer sb = new StringBuffer();
sb.append("clientNo=").append(map.get("clientNo"));
sb.append("&type=").append(map.get("type")).append("&timestamp=").append(map.get("timestamp"));
System.out.println("加密前的数据:"+sb.toString());
// 本地能配对的keystore 和 cer 文件
String  keystore = "test.keystore";
String password ="123456";
String alias = "test";
String sig = signData(sb.toString(),keystore,password,alias);
System.out.println(sig);
map.put("signdata", sig);
String cer = "server.cer";
boolean bln = verifyRSAMessageByPublic(sb.toString(), map.get("signdata"), cer);
System.out.println(bln);


}


/**
* 用私钥签名数据
* @param signparam 加密的参数
* 格式String requestParam = "name1=value1&name2=value2&name3=value3";
* 
* @param keystore  源文件夹下私钥.keystore文件的文件名
* @param passwordjdk的keytool 工具生成文件时候设置的密码
* @param aliasjdk的keytool 工具生成文件时候设置的别名
* @return
*/
public static String signData(String signparam, String keystore,String password,String alias) {
InputStream in = null;
try {
KeyStore ks = KeyStore.getInstance("JKS");
in = Thread.currentThread().getContextClassLoader().getResourceAsStream(keystore);
/* jdk的keytool 工具生成文件时候设置的密码 */
char[] storePwd = password.toCharArray();


ks.load(in, storePwd);
in.close();
// jdk的keytool 工具生成文件时候设置的别名
PrivateKey privateKey = (PrivateKey) ks.getKey(alias, storePwd);
Signature dsa = Signature.getInstance("SHA1withRSA");
dsa.initSign(privateKey);
dsa.update(signparam.getBytes());


Base64 base64Encoder = new Base64();
String signDate = new String(base64Encoder.encode(dsa.sign()));
return replaceNoneUrl(signDate);
} catch (Exception gse) {
System.out.println(gse);
return null;
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


/**
* 替换回不能通过GET方式传递的字符
* 
* @return
*/
public static String replaceFromUrl(String str) {
str = str.replaceAll("%2B", "\\+");
str = str.replaceAll("%2F", "\\/");
return str.replaceAll("%3D", "\\=");
}


/**
* 替换不能通过GET方式传递的字符
* 
* @return
*/
public static String replaceNoneUrl(String str) {
str = str.replaceAll("\\+", "%2B");
str = str.replaceAll("\\/", "%2F");
return str.replaceAll("\\=", "%3D");
}


}

输出日志:
加密前的数据:clientNo=000938873761&type=XT&timestamp=2017-09-01 13:50:16
X7yy1TegOvUYgAfK5a7e4e0b8FFNx4BXUYZZoQkxssfgURf%2FrU%2FEmS0GKnbZUeoo%2BYV5rTOhmlBhLSC%2BinLcyQCVRlEcXYEYeZ%2BmCgwcaL0PR1BSa5Ritr%2BvU92l4zXYbk2a9OHM2Y0Ge19gKPQBtatBbmiqrboacaKmz4YeJWY%3D
true


Kafka SASL_SSL双重认证 kafka提供了多种安全认证机制,主要分为SASL和SSL两大类。在 Kafka 中启用 SASL_SSL 安全协议时,SASL 用于客户端和服务器之间的身份验证,SSL 则用于加密和保护数据的传输。不仅提供身份验证,还提供加密和数据保护的功能。因工作需要,需要在测试环境搭建一套基于SASL_SSL协议的kafka环境。坑比较多,经过两天的研究终于搞定了,特在此记录下。 阅读详情

相关推荐

JDK自带工具keytool生成ssl证书

前言: 因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全。 百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具:keytool,外加看了同事的心得体会,自己总结了一下具体的使用方法和使用过程中发现的问题及解决办法。 1:什么是HTTPS? HTTPS其实是有两部分组成:HTTP+SSL/TLS, 也就是在HTTP上又加了一层处理加密信息的模块,并且会进行身份的验证。 问题: Firebug和p...

Mrs_haining的博客 3543

JDK自带工具keytool生成ssl证书(转)

打开浏览器 - 工具 - internet选项-内容- 证书-把中级证书颁发机构里的www.localhost.com(该名称即时你前面生成证书时填写的名字与姓氏)证书导出来-再把导出来的证书导入 受信任的根颁发机构 就OK了。百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具:keytool,外加看了同事的心得体会,自己总结了一下具体的使用方法和使用过程中发现的问题及解决办法。通话的双方,必须是都拥有证书的端,才能进行会话,换句话说,就是只有安装了咱证书的客户端,才能与服务器通信。

OKMZY的专栏 1713

达梦数据库配置SSL通信加密

注:执行过程中,当要求输入 cakey.pem 的存储私钥时,请输入“123456”,当要求输入 pkcs.p12 的 export password 时,请务必输入小写的“changeit”。本例设置的密码是123456。生成的ca私钥是ca-key.pem,自签名证书是:ca-cert.pem,都位于C:\OpenSSL-Win64\bin目录下面。是指具备一定资质条件的数字证书签发机构,包含根密钥和根证书, 其核心功能就是通过根密钥和根证书并使用一定的算法来”签发”和”管理”数字证书。

weixin_45699851的博客 4814

java生成SSL证书并添加信任,tomcat配置https访问并解决扫描漏洞问题

Keytool 是一个 Java 数据证书的管理工具 ,Keytool 将密钥(key)和证书(certificates)存储于一个称为 keystore 的密钥库文件中。

mr__bai的博客 8674

各种版本的jdk对SSL和TLS的支付列表

SSL与TLS是用于网络通信的安全加密协议,TLS作为SSL的后续版本已完全取代后者。SSLv1-v3因安全漏洞被淘汰,而TLS历经多次升级(1.0-1.3),其中TLSv1.3在性能和安全性上最优。不同JDK版本对协议支持不同:JDK6/7仅支持老旧协议,JDK8+逐步支持TLSv1.2/1.3,JDK11+默认禁用不安全的TLSv1.0/1.1。开发者可通过命令行或Java代码查看当前JDK支持的协议和加密套件,推荐使用TLSv1.2/1.3确保通信安全。

chinafsb的专栏 1551

服务器SSL证书生成

摘要:本文详细介绍了SSL证书的生成与管理流程,包括服务器端和客户端证书的签发。主要内容包括:1)使用keytool工具生成密钥库文件(.jks);2)通过OpenSSL创建CA认证证书;3)建立客户端和服务端信任证书;4)对证书进行签名处理;5)提供完整的shell脚本实现自动化生成。所有证书有效期设为10年(3650天),采用RSA算法,存储路径为/usr/local/kafka/ca/,密码统一为wsaa2024@SSL。文中还包含keytool工具的基本功能说明和常用参数解释,为SSL安全通信的实施

俗尘某某 1542

keytool 错误: java.io.FileNotFoundException: cacerts (拒绝访问。)

文章目录项目场景问题描述原因分析解决方案参考文档 项目场景 我想要将阿里云的maven中央仓库证书导入到 JRE security 中。 问题描述 C:\Program Files\Java\jdk1.8.0_241\jre\lib\security>keytool -import -alias aliyun-maven -keystore cacerts -file E:\entSoftware\aliyun-maven.cer 输入密钥库口令: …………一堆证书内容信息 是否信任此证书? [

本海的窝 1万+

Android webview在https下实现ssl的双向认证

这篇文章的重点是实现SSL证书双向认证,包含: a.生成客户端与服务端证书。 b.搭建支持Https的服务器。 c.实现webview的双向证书认证。

zx的博客 4763

使用JDK自带工具keytool生成ssl证书

使用JDK自带工具keytool生成ssl证书 HTTPS简介 超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种网络安全传输协议。具体介绍以前先来介绍一下以前常见的HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协...

seeker的博客 6万+

【java】JDK安全模块JCE核心Cipher使用详解

1.概述 转载:JDK安全模块JCE核心Cipher使用详解 2.前提 javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适。Cipher是JCA(Java Cryptographic Extension,Java加密扩展)的核心,提供基于多种加解密算法的加解密功能。在不了解Cipher之前,我们在完成一些需要加解密的模块的时候总是需要到处拷贝代码,甚至有些错误的用法也被无数次拷贝,踩坑之后又要拷贝补坑的代码。为什么不尝试理解Cipher然后合理地使用呢? 3.知识补充 Cipher.

九师兄 5775

JDK生成ssl证书

JDK自带工具生成ssl证书,经过上述操作,使用HTTPS 端口为8443 进行访问的时候 就是经过SSL信息加密,不怕被截获了。 通话的双方,必须是都拥有证书的端,才能进行会话,换句话说,就是只有安装了咱证书的客户端,才能与服务器通信。

【java证书】JDK自带工具keytool生成ssl证书

JDK自带工具keytool生成ssl证书 前言: 因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全。 百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具:keytool,外加看了同事的心得体会,自己总结了一下具体的使用方法和使用过程中发现的问题及解决办法。 1:什么是HTTPS? HTT...

u011191463的专栏 970

Vivado工程备份实战:两种方法快速迁移Block Design(附路径避坑指南)

本文详细介绍了Vivado工程中Block Design(BD)备份与迁移的两种核心方法:文件夹直接复制法与TCL脚本生成法。针对FPGA工程师在项目迁移或团队协作时常见的IP丢失、路径报错等问题,提供了从原理到实战的操作指南与路径避坑策略,确保设计可复现与高效协作。

pz890123的博客 1310

https双向加密认证

一、背景&概念 HTTPS:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。 http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层。从发送端看,这一层负责把http的内容加密后送到下层 的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容。 SSL(Secure Socket Layer):是Netscape公司设计的主要用于WEB的安全传输协议。从名字就可以看出它在https协议栈中负

骷大人的博客 7406

详解modbus TCP通讯,并利用其实现欧姆龙PLC和西门子PLC的通讯

大家好,之前需要更新的MQTT通讯【2】因为硬件不足还不能发布出来,但最近在项目中涉及到西门子和欧姆龙之间的modbus TCP通讯,想到modbus TCP通讯是个非常常见并广泛使用的通讯协议,今天就结合最近做的测试给大家好好讲解一下,先提示一下,这边只给大家讲解如何实现,至于报文是什么,如何用socket来编写功能块或dll这边不会讲解,这块我会根据私信的小伙伴数量来考虑要不要出一篇如何用ST语言来编写modbus TCP功能块的博客。

dy186187的博客 1万+

永磁同步电机控制笔记:foc控制原理通俗讲义

引言 到此为止,永磁同步电机控制相关文章已经写了7篇,其中simulink仿真系列文章5篇,控制笔记系列文章2篇,恍惚间感觉少了一篇概论,在此插入一篇,也算是对入坑电机控制一年半来的知识梳理。 文章目录引言一、同步电机是怎么转起来的二、什么样的旋转磁场效率最高三、怎么精准控制旋转磁场的方向四、怎样调节dq轴电流 一、同步电机是怎么转起来的 永磁同步电机结构如下: 外围是定子绕组,中间为永磁体,设...

搞电机的博客 2万+

SSL单向认证和双向认证

SSL(Secure Sockets Layer,安全套接字协议)是为网络通信提供安全及数据完整性的一种安全协议。本文主要介绍 SSL 单向认证和双向认证。 关于证书 1、每个人都可以使用一些证书生成工具为自己的https站点生成证书(比如jdk的keytool),大家称它为“自签名证书”,但是自己生成的证书是不被互联网承认的,所以浏览器会报安全提示,要求你手动安装证书。只有通过权威的CA机构付费获得的证书才能被互联网承认(有点类似于根域服务器的权威机构)。 2、证书(无客户端服务端之分)保存着ip信

wwwlyj123321的博客 5388

在国产麒麟系统上,用Postfix和Dovecot手搓一个内部邮件服务器(附Foxmail配置)

本文详细介绍了在国产麒麟系统上使用Postfix和Dovecot搭建内部邮件服务器的完整流程,包括系统准备、核心配置、安全加固及客户端适配。针对国产环境的特殊需求,提供了依赖包适配、配置差异和Foxmail客户端配置的实用解决方案,助力企业实现高效内部协作。

weixin_33722405的博客 371

Java jdk keytool 实现SSL双向认证的方法(客户端与服务器)

本文实例讲述了Java实现SSL双向认证的方法。分享给大家供大家参考,具体如下: 我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的,当然如果你访问的URL压根就错了,那谁也没有办法。这个就是所谓的SSL单向认证。 但是实际中,我们有可能还会验证客户端是否符合要求,也就是给我们每个用户颁发一个证书,比且每个数字证书都是唯一的,不公开的。这样就能通过这个数字证书保证当前访问我服务器的这个用户是经过服务器认可的,其他人不可访问。 双向认证 从第一个层面上 确保了服务器 与客户端 都是互相认可的

HD243608836的博客 3308

最新Python爬虫实战(入门爬虫篇)——案例8:图书网畅销榜数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过 Python 爬虫技术,成功实现了对图书网畅销榜多页数据的批量爬取与 Excel 保存。代码采用模块化设计,包含分页参数构造、API 接口请求、JSON 数据解析、Excel 数据持久化等完整流程;通过配置模拟浏览器的请求头,有效规避基础反爬策略,保证请求的稳定性。整个爬虫逻辑遵循 “分页遍历 → 接口请求 → JSON 解析 → 提取图书信息 → 保存到 Excel” 的标准流程,与电商类接口爬取范式高度一致。

努力让自己发光,对的人才能迎着光而来 29万+

游戏市场销售数据抓取:使用Python爬虫获取游戏市场上的销售情况和玩家反馈

在本文中,我们使用Python爬虫抓取了多个游戏平台上的销售数据、玩家反馈和游戏动态。通过使用requests和Selenium,我们能够有效地获取静态和动态网页数据,并利用pandas进行数据处理和存储。如果您有更具体的需求,可以扩展此爬虫以抓取更多的数据,进行深度分析或实现更复杂的可视化功能。数据抓取是一项非常强大的技术,它不仅能够帮助游戏开发者优化产品,还能帮助营销团队理解玩家需求,提升市场竞争力。

2201_76125261的博客 1308

Android MQTT TLS/SSL 认证

MQTT 是一种轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。为了确保通讯安全,通常使用 TLS/SSL 来进行通讯加密。 本文主要介绍如何通过 Android 与 MQTT 进行 TLS/SSL 单向认证和双向认证。 准备 本文使用 Eclipse Paho Android Service 和 BouncyCastle,添加依赖 dependencies { implementation 'org.eclipse.paho:org.ecl

emqx_broker的博客 1615

注意力机制篇 | YOLOv8改进之在C2f模块添加EMA注意力机制(附2种改进方法)

EMA(Exponential Moving Average)注意力机制是一种用于增强模型性能的注意力机制,它通过对模型的特征图进行加权平均来提取更有用的特征信息。具体来说,EMA注意力机制通过引入一个权重因子来调整特征图中每个位置的重要性,从而使模型能够更好地关注重要的特征。🌈

小哥谈 4180
上一篇: 集成tiles框架
下一篇: 文件格式批量转换
java_resolver
博客等级 码龄10年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值