https代理服务器(四)java动态签发【失败】
https://zhuanlan.zhihu.com/p/355241710?utm_id=0
http://t.zoukankan.com/xiaxj-p-8961131.html
https://www.cnblogs.com/cwjcsu/archive/2012/10/05/8433078.html
https://www.iteye.com/blog/zhuyuehua-1102143
https://www.cnblogs.com/cwjcsu/archive/2012/10/05/8433079.html
sslcontxt
https://www.codenong.com/11143360/
https://blog.csdn.net/shuxiaohua/article/details/118463065
始终搞不定,算了,用mkcert,因为这一块Security本身就是jdk jre强相关,可移植性可部署性也没比mkcert强到哪里:
package com.jds.test.httpproxy.miniserver; import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.Extension;
import org.bouncycastle.asn1.x509.GeneralName;
import org.bouncycastle.asn1.x509.GeneralNames;
import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.InputAEADDecryptor;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import java.io.*;
import java.math.BigInteger;
import java.security.cert.Certificate;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.List; /**
* Created by mac on 2022/12/19.
*/
public class CAServer {
public static void main(String[] args) throws KeyStoreException,
NoSuchAlgorithmException, CertificateException,
FileNotFoundException, IOException, UnrecoverableEntryException {
//读取CA证书的JKS文件
KeyStore store = KeyStore.getInstance("PKCS12");
// File file = new File("/Users/mac/Downloads/rootCA.txt");
InputStream inputStream = CAServer.class.getClassLoader().getResourceAsStream("rootCA.p12");
store.load(inputStream, "hhh123".toCharArray()); KeyStore.PrivateKeyEntry ke = (KeyStore.PrivateKeyEntry) store.getEntry("1",
new KeyStore.PasswordProtection("hhh123".toCharArray()));
String subject = "C=cn,ST=sh,L=sh,O=mkcert development certificate,OU=mac@macdeMacBook.local,CN=myhost.com,E=sh";
//给alice签发证书并存为xxx-alice.jks的文件
gen(ke, subject, "myhost.com"); } //用KeyEntry形式存储一个私钥以及对应的证书,并把CA证书加入到它的信任证书列表里面。
public static void store(PrivateKey key, Certificate cert,
Certificate caCert, String name) throws KeyStoreException,
NoSuchAlgorithmException, CertificateException, IOException {
KeyStore store = KeyStore.getInstance("JKS");
store.load(null, null);
store.setKeyEntry(name, key, "".toCharArray(), new Certificate[] {
cert, caCert });
File file = new File("/Users/mac/Downloads/jdk.jks");
if (file.exists() || file.createNewFile()) {
store.store(new FileOutputStream(file), ("_"+name).toCharArray());
}
} //用ke所代表的CA给subject签发证书,并存储到名称为name的jks文件里面。
public static void gen(KeyStore.PrivateKeyEntry ke, String subject, String name) {
try {
X509Certificate caCert = (X509Certificate) ke.getCertificate();
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair keyPair = kpg.generateKeyPair(); KeyStore store = KeyStore.getInstance("JKS");
store.load(null, null);
String issuer = caCert.getIssuerDN().toString();
Certificate cert = generateV3(issuer, subject,
BigInteger.valueOf(System.currentTimeMillis()), new Date(System.currentTimeMillis() - 1000
* 60 * 60 * 24),
new Date(System.currentTimeMillis() + 1000L * 60 * 60 * 24
* 365 * 2), keyPair.getPublic(),//待签名的公钥
ke.getPrivateKey()//CA的私钥
, null);
store(keyPair.getPrivate(), cert, ke.getCertificate(), name);
} catch (Exception e) {
e.printStackTrace();
}
} public static Certificate generateV3(String issuer, String subject,
BigInteger serial, Date notBefore, Date notAfter,
PublicKey publicKey, PrivateKey privKey, List<Extension> extensions)
throws OperatorCreationException, CertificateException, IOException { X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
new X500Name(issuer), serial, notBefore, notAfter,
new X500Name(subject), publicKey);
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
ContentSigner sigGen = new JcaContentSignerBuilder("SHA256WithRSAEncryption")
.setProvider("BC").build(privKey);
//privKey是CA的私钥,publicKey是待签名的公钥,那么生成的证书就是被CA签名的证书。
GeneralNames subjectAltName = new GeneralNames(new GeneralName(GeneralName.dNSName, "myhost.com"));
builder.addExtension(X509Extensions.SubjectAlternativeName, false, subjectAltName);
X509CertificateHolder holder = builder.build(sigGen);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream is1 = new ByteArrayInputStream(holder.toASN1Structure()
.getEncoded());
X509Certificate theCert = (X509Certificate) cf.generateCertificate(is1);
is1.close();
return theCert;
}
}
https代理服务器(四)java动态签发【失败】的更多相关文章
- java动态代理——jvm指令集基本概念和方法字节码结构的进一步探究及proxy源码分析四
前文地址 https://www.cnblogs.com/tera/p/13336627.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF
1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- Java 动态代理
被代理的接口特点: 1. 不能有重复的接口,以避免动态代理类代码生成时的编译错误. 2. 这些接口对于类装载器必须可见,否则类装载器将无法链接它们,将会导致类定义失败. 3. 需被代理的所有非 pub ...
- 一文读懂Java动态代理
作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- [转]Java 动态代理机制分析及扩展
引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
- JAVA 动态代理原理和实现
在 Java 中动态代理和代理都很常见,几乎是所有主流框架都用到过的知识.在面试中也是经常被提到的话题,于是便总结了本文. Java动态代理的基本原理为:被代理对象需要实现某个接口(这是前提),代理对 ...
- java动态代理实现与原理详细分析(代码层面解释了AOP的实现)
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 代理模式是常用的java设计模式, ...
- Java 动态代理机制分析及扩展--转
http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/#icomments http://www.ibm.com/developerworks/c ...
随机推荐
- Spring Boot如何自定义监控指标
1.创建项目 pom.xml引入相关依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...
- unity 音频曲线
jp--------------- https://techblog.kayac.com/dynamic-waveform-generation-without-audio-clip https:// ...
- 【8】java之引用传递
一.引用传递 引用传递是整个 java 的精髓所在 引用传递核心意义:同一块堆内存空间可以被不同的栈内存所指向,不同栈内存可以对同一块堆内存内容进行修改. 范例:第一道引用传递范例 class Me ...
- 安装完IDEA后无法打开
安装完IDEA后无法打开 一.现象 安装完IDEA2021.3版本后,无论用什么办法都无法打开 二.原因 原先有安装过idea,里面有加载过一些插件,或者是破解过,会生成一些文件,导致IDEA无法运行 ...
- Head First Python(第2版)书籍 重视大脑的学习指南
Head First Python(第2版)PDF高清版书籍免费下载地址 提取码:08eo 内容简介 · · · · · · 你想过可以通过一本书就学会Python吗?<Head First ...
- 2022-04-26内部群每日三题-清辉PMP
1.一家组织的经验教训数据库表明过去的重大项目问题是质量失败.项目经理在制定质量管理过程时决定做得更彻底.为确保质量,项目经理应该怎么做? A.根据项目的范围和需求制定质量管理计划. B.将所有质量控 ...
- kafak学习总结
高可用 多副本机制: 主副本和从副本,从副本只负责同步主副本数据,只有主副本进行读写. 高并发 网络结构设计 多路复用 多selector -> 多线程-> 多队列 高性能 写 把数据先写 ...
- Cannot read properties of null (reading ‘insertBefore‘)
一.报错现象 vue3 + element plus 项目,本地启动时,页面进行所有操作都正常:部署到test环境后,数据驱动DOM变化的操作会导致如下报错. 二.可能原因及解决方案 经过分析出现报错 ...
- 078_Sublime HaoIDE 搭建 Lightning Aura环境
随着 Classic 不断的向 1 .HaoIDE->Setting->User Setting 请把以下内容copy进去,修改账号密码token以及项目名称,例子中列举了两个Projec ...
- Java笔记_变量作用域
变量作用域 在Java中主要的变量就是属性(成员变量)和局部变量. 局部变量一般是指在成员方法中定义的变量. 全局变量作用域:整个类体.局部变量(除属性意以外的其他变量)作用域:为定义它的代码块中! ...