groovy生成证书 X509CertificateObject

本文提供了一个使用Java和BouncyCastle库生成SM2算法X509证书的示例代码。介绍了如何设置证书的基本信息,如序列号、有效期、签名算法等,并展示了如何将生成的证书保存到文件。
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;其他的流写不出!

在Kotlin中解析X.509证书可以借助Java标准库中的`java.security.cert`包,该包提供了用于处理X.509证书的类和方法。Kotlin作为JVM语言可以直接使用这些Java API进行操作。 ### 解析X.509证书的基本步骤 1. **读取证书文件或字节数组**:X.509证书通常以`.cer`、`.crt`或`.pem`格式存储。你可以从文件、网络流或字节数组中读取证书内容。 2. **使用`CertificateFactory`生成证书对象**:通过`CertificateFactory.getInstance("X.509")`创建一个X.509证书工厂,然后使用其`generateCertificate()`方法将输入流转换为`X509Certificate`对象。 3. **获取证书信息**:一旦获得`X509Certificate`对象,就可以调用其方法来获取颁发者、主题、有效期、公钥等信息。 ### 示例代码 以下是一个完整的示例,展示如何在Kotlin中解析X.509证书并输出一些基本信息: ```kotlin import java.io.FileInputStream import java.security.cert.CertificateFactory import java.security.cert.X509Certificate import java.util.* fun main() { val certPath = "path/to/your/certificate.cer" // 读取证书文件 val inputStream = FileInputStream(certPath) val certificateFactory = CertificateFactory.getInstance("X.509") val certificate = certificateFactory.generateCertificate(inputStream) as X509Certificate // 输出证书基本信息 println("证书版本: ${certificate.version + 1}") // 版本号从0开始,实际显示加1 println("序列号: ${certificate.serialNumber.toString(16).uppercase(Locale.getDefault())}") println("颁发者: ${certificate.issuerDN.name}") println("主体: ${certificate.subjectDN.name}") println("有效期起始: ${certificate.notBefore}") println("有效期截止: ${certificate.notAfter}") println("公钥算法: ${certificate.publicKey.algorithm}") println("签名算法: ${certificate.sigAlgName}") } ``` ### 注意事项 - 如果证书是以PEM格式(Base64编码)存储的,你需要先将其解码为DER格式的字节数组,然后再传递给`generateCertificate()`方法。 - 可以使用第三方库如[Bouncy Castle](https://www.bouncycastle.org/)来处理更复杂的证书操作,例如签发、验证路径构建等。 ### 使用Bouncy Castle扩展支持(可选) 如果你需要处理更复杂的X.509v3特性,建议添加Bouncy Castle依赖项,并注册它作为安全提供者: #### 添加依赖(Gradle) ```groovy dependencies { implementation 'org.bouncycastle:bcprov-jdk15on:1.70' } ``` #### 注册Bouncy Castle提供者 ```kotlin import org.bouncycastle.jce.provider.BouncyCastleProvider import java.security.Security fun registerBouncyCastle() { Security.addProvider(BouncyCastleProvider()) } ``` 确保在解析证书之前调用`registerBouncyCastle()`函数[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值