import java.nio.Buffer;
/**
* @author TBear
*
*/
import java.awt.TexturePaintContext.Byte;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.SignatureException;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateParsingException
import java.security.cert.X509Certificate;
import javax.security.auth.x500.X500Principal;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.DERBitString
import org.bouncycastle.asn1.DERInteger
import org.bouncycastle.asn1.DERSequence
import org.bouncycastle.asn1.DERUTCTime
import org.bouncycastle.asn1.x509.AlgorithmIdentifier
import org.bouncycastle.asn1.x509.BasicConstraints
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.asn1.x509.V3TBSCertificateGenerator
import org.bouncycastle.asn1.x509.X509CertificateStructure
import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.asn1.x509.X509ExtensionsGenerator;
import org.bouncycastle.asn1.x509.X509Name
import org.bouncycastle.jce.provider.BouncyCastleProvider
import org.bouncycastle.jce.provider.X509CertificateObject
import org.bouncycastle.x509.extension.SubjectKeyIdentifierStructure;
import com.itrus.raapi.info.CertInfo;
public class CertService{
public static void main(String[] args)
{
X509CertificateObject certificate = genSM2_Cert();
byte[] buffer = certificate.getEncoded();
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(new File('E:/abc.cer')));
outputStream.write buffer;
outputStream.flush();
outputStream.close();
}
//X509CertificateObject
static X509CertificateObject genSM2_Cert() throws CertificateParsingException{
long currTime = new Date().getTime();
String issuerDN = "cn=ibm";
String subjectDN = "cn=ibm";
int vday = 10;
//证书生成
V3TBSCertificateGenerator v3CertGen = new V3TBSCertificateGenerator();
//系列号
DERInteger serialNumber = new DERInteger(BigInteger.valueOf(currTime));
v3CertGen.setSerialNumber(serialNumber);
//发行人
v3CertGen.setIssuer(new X509Name(issuerDN));
//开始时间和结束时间
v3CertGen.setStartDate(new DERUTCTime(new Date(currTime)));
v3CertGen.setEndDate(new DERUTCTime(new Date(currTime + vday*24*60*60*1000)));
//主题
v3CertGen.setSubject(new X509Name(subjectDN));
//签名算法
AlgorithmIdentifier algSign = new AlgorithmIdentifier("1.2.156.197.1.501");
v3CertGen.setSignature(algSign);
//公钥算法
AlgorithmIdentifier algKey = new AlgorithmIdentifier("1.2.156.197.1.301");
byte[] pubData = new byte[65];
pubData[0] = 0;
for(byte i=1;i<pubData.length;i++){
pubData[i] = i;
}
//有公钥算法和签名算法生成公钥信息摘要
SubjectPublicKeyInfo pubKeyInfo = new SubjectPublicKeyInfo(algKey,pubData);
v3CertGen.setSubjectPublicKeyInfo(pubKeyInfo);
byte[] signInfo = new byte[69];
for(byte i=1;i<pubData.length;i++){
pubData[i] = i;
}
X509ExtensionsGenerator extenGen = new X509ExtensionsGenerator();
//extenGen.addExtension(paramDERObjectIdentifier, paramBoolean, paramArrayOfByte);
X509Extensions exten = extenGen.generate();
v3CertGen.setExtensions(exten);
ASN1EncodableVector asn1encodablevector = new ASN1EncodableVector();
asn1encodablevector.add(v3CertGen.generateTBSCertificate());
asn1encodablevector.add(algSign);
asn1encodablevector.add(new DERBitString(signInfo));
return new X509CertificateObject(new X509CertificateStructure(new DERSequence(asn1encodablevector)));
}
}
注意最终的输出流必须用BufferedOutputStream;其他的流写不出!
分享到:
相关推荐
IDEA groovy生成实体解决乱码问题
IDEA连接数据库生成带注解的实体类方法与定制Groovy生成脚本适用于springboot jpa中IDEA连接数据库生成带注解的实体类方法与定制Groovy生成脚本适用于springboot jpa中
Groovy是一种动态、开源的编程语言,它是Java平台上的一个JVM(Java Virtual Machine)语言。Groovy结合了Python、Ruby和Perl等脚本语言的简洁性和灵活性,并且完全兼容Java,可以无缝地与Java代码集成。在"groovy-...
IDEA自带的插件Generate POJOs.groovy 比较简陋,不能生成完整的dao/mapper,切生成的POJO没有注解。没有统一格式化,所以在此基础上进行了扩展能够简单的生成pojo/dao/mapper. 使用时选择目录后会在改目录下生成...
JUN SpringBoot API Service 是一个基于SpringBoot+Groovy+SQL动态生成API并动态发布,且发布后可动态执行groovy脚本及SQL脚本的API服务项目。提供在线执行动态程序脚热加载本及动态生成API并执行的功能。支持动态...
它继承自Java的ClassLoader,能解析Groovy源码并生成字节码。 3. 加载并执行Groovy脚本:通过GroovyClassLoader的`parseClass()`方法解析Groovy源码,然后使用`newInstance()`方法创建脚本实例,最后通过`...
apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...
日常的开发都用到 Mybatis Plus,但是每次开新功能都得设计表、映射实体代码,写相关service、mapper。...于是自己写了个Groovy脚本来生成 演示文章链接:https://blog.csdn.net/m4330187/article/details/122444249
本篇文章将重点讲解如何使用Groovy调用Weka来生成决策树。 在Groovy中调用Weka,首先需要确保你的环境中已经安装了Weka库。这通常通过Maven或Gradle等构建工具添加依赖来实现。对于Maven,可以在pom.xml文件中添加...
7. **Groovy JSON Support**: 内置的JSON处理能力,使得Groovy可以方便地解析和生成JSON格式的数据。 8. **Groovy HTML and XML Processing**: 提供了简洁的API来处理HTML和XML文档,如GPath和XmlSlurper。 9. **...
标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...
Groovy是一种动态、灵活的编程语言,它是Java平台上的一个扩展,可以无缝集成到Java项目中。Groovy的语法简洁,支持面向对象编程、函数式编程,并提供了许多现代语言特性,如闭包和动态类型。这使得Groovy成为快速...
### Groovy Script 入门知识点详解 #### 一、Groovy脚本简介 Groovy是一种灵活的面向对象的编程语言,它运行在Java平台上。由于其语法简洁且与Java高度兼容,因此对于Java开发者来说非常容易上手。Groovy不仅支持...
这个版本(2.4.8)是Groovy在2.x系列中的一个稳定发行版,提供了一系列的功能和性能改进。 1. **Groovy简介** - Groovy是一种基于Java虚拟机(JVM)的编程语言,它与Java高度兼容,可以直接调用Java库。 - 它引入...
Groovy 入门教程 Groovy 是一种基于 Java 语言的脚本语言,运行在 JVM 中,语法与 Java 相似,但抛弃了 Java 的一些烦琐的语法规则,提供了更加简洁和灵活的编程体验。 Groovy 的特点 1. 简洁的语法:Groovy 语法...
4. 书籍明确强调Groovy 2版本,这意味着书中内容特指Groovy语言的2.x版本,且可能包含了Groovy 1.x版本中不支持或变化较大的特性。 5. 书籍的版权信息表明,该书享有版权保护,不得未经授权进行复制或传播,也未经...
Apache Groovy SDK 4.0.1 是一个重要的软件开发工具包,专为使用Groovy编程语言进行开发的程序员设计。Groovy是一种基于Java平台的动态、灵活的编程语言,它扩展了Java语言的功能,提供了简洁的语法和强大的元编程...