java 从 PKCS12(比如pfx格式)证书中提取私钥证书(PrivateKey)和受信任的公钥证书(X509Certificate)的序列号(SerialNumber)
2023-09-11 14:17:56 时间
import lombok.Cleanup; import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; import lombok.experimental.UtilityClass; import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.Enumeration; /** * An utility class for obtaining {@link PrivateKey} and the serial number of the trusted {@link X509Certificate}
* from keystore in PKCS12 format
*/ @Getter @Setter @UtilityClass public class SignCertInfo { private static final SignCertInfo DEFAULT = new SignCertInfo(); private String certId; private PrivateKey privateKey; public static SignCertInfo createNew(Configs configs) { return createNewFrom(getKeyStore(configs), configs); } @SneakyThrows private static SignCertInfo createNewFrom(KeyStore store, Configs configs) { Enumeration<String> aliases = store.aliases(); while (aliases.hasMoreElements()) { String alia = aliases.nextElement(); if (isX509Cert(store, alia)) { newSignCertInfo(store, alia, configs); } } return DEFAULT; } @SneakyThrows private static KeyStore getKeyStore(Configs configs) { @Cleanup FileInputStream stream = new FileInputStream(configs.getPfxPath()); KeyStore store = KeyStore.getInstance(Pkcs12KeyStore.TYPE, Pkcs12KeyStore.PROVIDER); store.load(stream, configs.getPfxPasswd().toCharArray()); return store; } @SneakyThrows private static boolean isX509Cert(KeyStore store, String alia) { return CertificateType.X509.equalsIgnoreCase(store.getCertificate(alia).getType()); } @SneakyThrows private static SignCertInfo newSignCertInfo(KeyStore store, String alia, Configs configs) { SignCertInfo signCertInfo = new SignCertInfo(); signCertInfo.setCertId(((X509Certificate) store.getCertificate(alia)).getSerialNumber().toString()); signCertInfo.setPrivateKey((PrivateKey) store.getKey(alia, configs.getPfxPasswd().toCharArray())); return signCertInfo; } }
public interface Pkcs12KeyStore { String TYPE = "PKCS12"; String PROVIDER = "SunJSSE"; }
相关文章
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- 在Java中怎样高效的推断数组中是否包括某个元素
- 【JAVA】JSP操作数据库简单实例和mysql-connector-java-5.0.3-bin.jar项目配置方法
- Java自学指南一、找一个开始并能坚持下去的理由
- java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup
- java去除html代码中含有的html、js、css标签,获取文字内容
- Java项目(前端vue后台java微服务)在线考试系统(java+vue+springboot+mysql+maven)
- 第74节:Java中的Cookie和Session
- Java集合框架中底层文档的List与Set
- 【Java】Eclipse如何创建java项目并运行
- C/C++/Java代码 模式匹配算法 KMP算法 数据结构【经典算法思想】详解
- CentOS 安装Java
- 《Java入门经典(第7版)》—— 6.11 练习
- 《Java和Android开发实战详解》——2.2节构建Java应用程序
- (Java实习生)每日10道面试题打卡——JVM篇 (三)
- Java经典实例:使用正则表达式:测试模式
- Java 设计模式之桥接模式,Java 桥接模式 ,java Bridge Pattern
- Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求
- java基础的第二轮快速学习!day01
- 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- Java_并发工具包 java.util.concurrent 用户指南(转)
- JAVA生成RSA非对称型加密的公钥和私钥(利用JAVA API)
- 浅析Java对集合进行操作时报java.util.ConcurrentModificationException并发修改异常问题:产生原因、单线程/多线程环境解决、CopyOnWriteArrayList线程安全的ArrayList、fail-fast快速失败机制防止多线程修改集合造成并发问题
- 【深入JAVA】java注解
- [java][db]JAVA分布式事务原理及应用
- Java数组List换算方法
- Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制--转载
- Java Class.isAssignableFrom(Class) 与 instanceof 的区别