Java,数字证书,证书签名和验签,格式转换,JKS格式与PFX转换
概述
数字证书
互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名)。
数字证书是由权威机构(CA机构),又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。
数字证书的应用场景
1、服务器证书,安装于服务器设备上,用来证明服务器的身份和进行通信加密,服务器证书可以用来防止欺诈钓鱼站点。
2、客户端个人/企业组织证书,用来身份认证和电子签名的,SSL双向登录,文档签名,代码签名,一些网页上的表单签名。
数字证书相关参考内容:
1、密钥库和证书格式: https://www.toutiao.com/a6934192620839109127/
2、Nginx配置SSL证书: https://www.toutiao.com/a7028371480148754956/
3、读取网站申请SSL证书,JKS、PFX、CRT格式: https://www.toutiao.com/a7029183711942066695/
4、命令制作证书及代码生成证书:https://www.toutiao.com/i7042515644935406118/?group_id=7042515644935406118证书签名
pom.xml org.bouncycastle bcprov-jdk15to18 1.70 org.bouncycastle bcpkix-jdk15to18 1.70
签名和验签案例 package com.what21.netty01.demo01.sign; import com.what21.netty01.demo01.cert2.KeyStoreUtils; public class CertSignUtilsDemo { public static void main(String[] args) { // 读取证书 KeyStoreUtils.KeyStoreEntry keyStoreEntry = KeyStoreUtils.readToKeyStoreEntry(); // ========================================================================// // 证书签名====>使用证书私钥签名 // ========================================================================// String text = "被签名的内容"; String signContent = ""; try { // 签名 signContent = CertSignUtils.sign(keyStoreEntry.getPrivateKey(), text); } catch (Exception e) { e.printStackTrace(); } System.out.println(signContent); // ========================================================================// // 证书验签====>使用证书公钥验签 // ========================================================================// boolean verifySigned = false; try { // 验签 verifySigned = CertSignUtils.verify(keyStoreEntry.getPublicKey(), text, signContent); } catch (Exception e) { e.printStackTrace(); } System.out.println(verifySigned); } }package com.what21.netty01.demo01.sign; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.util.Base64; public class CertSignUtils { /** * 签名 * * @param privateKey * @param content * @return * @throws Exception */ public static String sign(PrivateKey privateKey, String content) throws Exception { // 用私钥对信息生成数字签名 Signature signature = Signature.getInstance("SHA384WithRSA"); signature.initSign(privateKey); byte[] data = content.getBytes("utf-8"); signature.update(data); byte[] signedData = signature.sign(); return Base64.getEncoder().encodeToString(signedData); } /** * 验证签名 * * @param publicKey * @param content * @param sign * @return * @throws Exception */ public static boolean verify(PublicKey publicKey, String content, String sign) throws Exception { Signature signature = Signature.getInstance("SHA384WithRSA"); signature.initVerify(publicKey); byte[] data = content.getBytes("utf-8"); signature.update(data); boolean result = signature.verify(Base64.getDecoder().decode(sign)); return result; } }
JKS格式与PFX格式相互转换 package com.what21.netty01.demo01.cert3; import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.Key; import java.security.KeyStore; import java.security.cert.Certificate; import java.util.Enumeration; public class JKSConvertor { // 证书格式 public static final String JKS = "JKS"; public static final String PKCS12 = "PKCS12"; /** * @param storePath * @param storePasswd * @param pfxPath * @throws Exception */ public static void toPKCS12(String storePath, String storePasswd, String pfxPath) throws Exception { // 读取KeyStore KeyStore inputKeyStore = KeyStore.getInstance(JKS); FileInputStream inputStream = new FileInputStream(storePath); char[] nPassword = storePasswd.toCharArray(); inputKeyStore.load(inputStream, nPassword); inputStream.close(); // 创建PKCS12 KeyStore outputKeyStore = KeyStore.getInstance(PKCS12); outputKeyStore.load(null, storePasswd.toCharArray()); Enumeration enumStrs = inputKeyStore.aliases(); while (enumStrs.hasMoreElements()) { String keyAlias = enumStrs.nextElement(); if (inputKeyStore.isKeyEntry(keyAlias)) { Key key = inputKeyStore.getKey(keyAlias, nPassword); Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias); outputKeyStore.setKeyEntry(keyAlias, key, storePasswd.toCharArray(), certChain); } } // 输出 FileOutputStream outputStream = new FileOutputStream(pfxPath); outputKeyStore.store(outputStream, nPassword); outputStream.close(); } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { JKSConvertor.toPKCS12("D://localhost_server.jks", "123456", "D://localhost_server.pfx"); JKSConvertor.toPKCS12("D:/localhost_client1.jks", "123456", "D:/localhost_client1.pfx"); } }package com.what21.netty01.demo01.cert3; import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.Key; import java.security.KeyStore; import java.security.cert.Certificate; import java.util.Enumeration; public class PKCS12Convertor { // 证书格式 public static final String JKS = "JKS"; public static final String PKCS12 = "PKCS12"; /** * @param pfxPath * @param storePasswd * @param jksPath * @throws Exception */ public static void toJKS(String pfxPath, String storePasswd, String jksPath) throws Exception { KeyStore inputKeyStore = KeyStore.getInstance(PKCS12); // 加载证书 FileInputStream inputStream = new FileInputStream(pfxPath); // P12证书密码 char[] nPassword = storePasswd.toCharArray(); inputKeyStore.load(inputStream, nPassword); inputStream.close(); KeyStore outputKeyStore = KeyStore.getInstance(JKS); outputKeyStore.load(null, storePasswd.toCharArray()); Enumeration enumStrs = inputKeyStore.aliases(); while (enumStrs.hasMoreElements()) { String keyAlias = enumStrs.nextElement(); if (inputKeyStore.isKeyEntry(keyAlias)) { Key key = inputKeyStore.getKey(keyAlias, nPassword); Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias); outputKeyStore.setKeyEntry(keyAlias, key, storePasswd.toCharArray(), certChain); } } FileOutputStream outputStream = new FileOutputStream(jksPath); outputKeyStore.store(outputStream, nPassword); outputStream.close(); } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // keytool -list -keystore D://localhost_server.2.jks // keytool -list -rfc -keystore D://localhost_server.2.jks -storepass 123456 PKCS12Convertor.toJKS("D://localhost_server.pfx", "123456", "D://localhost_server.2.jks"); // keytool -list -keystore D://localhost_client1.2.jks // keytool -list -rfc -keystore D://localhost_client1.2.jks -storepass 123456 PKCS12Convertor.toJKS("D:/localhost_client1.pfx", "123456", "D:/localhost_client1.2.jks"); } }
什么是区块链?有很多朋友都问过我一个问题,什么是区块链?以前也断断续续地讲过一些区块链的内容,集中性不太强,今天干脆我们单独讲一讲区块链,把它讲透。然后您就会明白,区块链和各种数字资产,加密货币
618千元机怎么选?以下4款物超所值,总有你想要的618年中购物节来了,这次优惠程度,丝毫不比双十一差,很多手机厂商为了销量,高端机大幅度跌价,新机也有所跌价,这点在以往是没有出现过的。相信不少网友想在618选择一款适合自己的手机
韩国银行寻找开发央行数字货币的技术伙伴韩国的国家数字货币试点计划在2021年8月至12月进行。据悉,韩国央行目前正在寻找一个技术供应商来设计一个数字韩元的试点平台。韩国央行正在推进其国家数字货币计划,因为它现在正在寻找
中国黑客教父,国旗挂到日本网站,光顾美金融系统,拒马云聘请发展到今天,互联网依然是个很神奇的东西。他可以在最短的时间内缩短人与人之间沟通交流的距离,不过这一方是我们普通人用得最多。但对于一些互联网大佬而言,他们可以利用互联网研发出很多AP
新能源中的异类,理想ONE理想ONE这款车感刚刚上市的时候,有很多朋友问我是否看好这款车,他们对这款车表现出了极大的兴趣,那我们今天就来看一看,传说中的增程式电动车理想ONE到底怎么样。在我所知的三缸车型中
行情分析跳水近千元,iPhone12系列还值得买吗?涛哥价格分析,一起走进华强北行情趋势。这两天华强北一直在风口浪尖上,赛格大厦因为不明原因晃动一直霸占着热搜榜,这座华强北地标级建筑目前已由专家进行排查原因,在官方原因未出之前我们不
关于比特币,以太坊数字货币未来猜想我是从今年年初开始关注比特币的,后来下载了火币,开始关注数字货币,年初的一波暴涨行情,吸引了无数的韭菜前来观摩,并梦想着有一天能够暴富,可惜,历史再次证明,暴富只是少数一部分人,无
618路由器推荐网速不够快,很可能不是网络的问题hello,大家好,由于众所周知的原因,6。18是无机可装的,那么也只能玩玩手机了,这个时候,WIFI的作用就非常的大了,那么6。18我就推荐几款路由器吧,当然选购之前,总有那么几
荣耀CEO赵明强调智慧屏坚持开关机无广告5月安卓手机好评榜公布科技犬荣耀智慧生活官方表示,荣耀智慧屏X1系列用五大标准与开关机无广告造就好产品。618开门红再夺销量冠军,6月5日6月6日荣耀智慧屏X165英寸版年度钜惠价2999元。荣耀终端有
简单好用的入门机诺基亚C20Plus诺基亚的CXG三大系列手机,有着不同的特色,涵盖旗舰中端入门机C系列定义为简单好用的入门机,物美价廉,消费者可轻松入手智能手机,消费者能体验纯净安卓系统的智能手机。同时,诺基亚C系
面对美制裁,中企霸气反击直接切断美供应链本文原创,禁止搬运和抄袭,违者必究!大洋彼岸的美国,总是喜欢大搞黑手,任凭心意在全球化的市场中指指点点,搅弄浑水。类似将外企拉入黑名单的例子太多了,又有消息传来,称国产科技巨头科大