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"); } }
22年2月电脑DIY配置方案主观推荐30套方案我个人所创作DIY配置单,比较主观,所写配件只是基础,各位朋友可在这基础上选择更好的配件进行升级,也可直接简单照搬使用。你们自己DIY装机还是去买整机,都可参考我写的配置单进行比价
对于初学者而言亿择云库是个不错的选择身为一名站长,时常都会有遇到新手来问问题,最近就有许多人加我,有些是问关于网上亿择云库的,有问的是适不适合网络小白?我已经是一名宝妈能做不?有什么门槛吗?等疑问,所以它的受众人群有
GovsJavavsC语法对比1。说明最近在学习Go,在学习的过程中为了加快学习速度将新知识添加到已有知识体系架构中,总是会拿Go和其他开发语言进行对比,最终进行总结,于是就有了这篇文章。对于每一个知识点结束时
你的上网行为,被老板监控了吗?近日,某互联网企业被曝安装了行为感知系统,可以监控员工浏览招聘网站投递简历等上网行为。网传图片显示,在行为感知系统内,可查看员工详细的离职倾向,某鞠姓员工访问求职网站23次,投递简
MQ幂等去重有哪些通用的解决方案?MQ幂等去重有哪些通用的解决方案?前言简单的消息去重解决方案并发重复消息ExactlyOnce基于关系数据库事务插入消息表更复杂的业务场景拆解消息执行过程更通用的解决方案更灵活的消
1吨值30亿美元,100吨够全球用1年!嫦娥五号带回月球氦3根据自然天文学(NatureAstronomy)杂志刊载的一项新研究1,来自中国科学院的科学家对嫦娥五号带回的月球样品进行了深入分析,填补了50年来的一项研究空白,这是当年美国阿波
微信拥有超过12亿用户,却仅排全球第三,第一和第二分别是谁?社交已经成为了人们生活当中必不可少的娱乐之一,无论是聊天交友还是商务办公,都会有人员之间的联系,而实现异地交流的聊天软件不计其数,在我国最为人所熟知的便是微信了。尽管QQ的使用者也
索罗斯四季度豪掷百亿重仓特斯拉神秘死敌Rivian根据索罗斯基金管理公司提交给美国证券交易委员会(SEC)的13F文件,这家由亿万富翁乔治索罗斯管理的基金公司于去年第四季度新购近两千万股Rivian,持仓市值约20。57亿美元,合
工信部回应手机资费问题6年流量费降幅超95来源人民网原创稿人民网领导留言板截图。人民网北京2月15日电(申佳平)近日,针对人民网领导留言板网民关于建议进一步降低全国手机卡收费标准的留言,工信部回复称,我国已放开所有电信业务
携程将推混合办公模式允许员工每周三和周五在家远程办公2月15日,元宵佳节当天,携程集团董事局主席梁建章在接受媒体采访时透露,携程将于3月份在公司推行32混合办公模式,允许员工每周三和周五在家远程办公。届时,全公司近三万名员工将实行混
在。Net7源码中bool代码优化起因代码总是从简单到复杂,从易读到晦涩,有的是业务逻辑复杂导致代码也复杂,有的是为了性能优化,导致代码不那么易读易懂了。这里主要是看到最近。Netbool类型源码变化。Stream