java实现x.509,使用Bouncy Castle Java API生成X.509证书

I am trying to generate a X.509 Certificate using Bouncy Castle Java API.

I found sample code at:

However, after compile the below codes, JVM shows an error message as shown below

Could not find the main class: org.bouncycastle.util.AllTests. Program will exit.

Note that org.bouncycastle.util.AllTests is inserted into the Java build path.

How can I fix my code to work properly?

import java.math.BigInteger;

import java.util.Date;

import org.bouncycastle.asn1.ASN1Object;

import org.bouncycastle.asn1.ASN1Sequence;

import org.bouncycastle.asn1.x500.X500Name;

import org.bouncycastle.asn1.x509.AlgorithmIdentifier;

import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;

import org.bouncycastle.cert.X509CertificateHolder;

import org.bouncycastle.cert.X509v1CertificateBuilder;

import org.bouncycastle.crypto.params.RSAKeyParameters;

import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters;

import org.bouncycastle.operator.ContentSigner;

import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder;

import org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder;

import org.bouncycastle.operator.bc.BcRSAContentSignerBuilder;

public class X509CertificateCreator{

AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA");

AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);

//define lwPrivKey

RSAKeyParameters lwPubKey = new RSAKeyParameters(

false,

new BigInteger("b4a7e46170574f16a97082b22be58b6a2a629798419be12872a4bdba626cfae9900f76abfb12139dce5de56564fab2b6543165a040c606887420e33d91ed7ed7", 16),

new BigInteger("11", 16));

RSAPrivateCrtKeyParameters lwPrivKey = new RSAPrivateCrtKeyParameters(

new BigInteger("b4a7e46170574f16a97082b22be58b6a2a629798419be12872a4bdba626cfae9900f76abfb12139dce5de56564fab2b6543165a040c606887420e33d91ed7ed7", 16),

new BigInteger("11", 16),

new BigInteger("9f66f6b05410cd503b2709e88115d55daced94d1a34d4e32bf824d0dde6028ae79c5f07b580f5dce240d7111f7ddb130a7945cd7d957d1920994da389f490c89", 16),

new BigInteger("c0a0758cdf14256f78d4708c86becdead1b50ad4ad6c5c703e2168fbf37884cb", 16),

new BigInteger("f01734d7960ea60070f1b06f2bb81bfac48ff192ae18451d5e56c734a5aab8a5", 16),

new BigInteger("b54bb9edff22051d9ee60f9351a48591b6500a319429c069a3e335a1d6171391", 16),

new BigInteger("d3d83daf2a0cecd3367ae6f8ae1aeb82e9ac2f816c6fc483533d8297dd7884cd", 16),

new BigInteger("b8f52fc6f38593dabb661d3f50f8897f8106eee68b1bce78a95b132b4e5b5d19", 16));

public void creation(){

try {

ContentSigner sigGen = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(lwPrivKey);

//

byte[] publickeyb=sigAlgId.getEncoded();

//SubjectPublicKeyInfo subPubKeyInfo = ....;

SubjectPublicKeyInfo subPubKeyInfo = new SubjectPublicKeyInfo((ASN1Sequence)ASN1Object.fromByteArray(publickeyb));

Date startDate = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000);

Date endDate = new Date(System.currentTimeMillis() + 365 * 24 * 60 * 60 * 1000);

X509v1CertificateBuilder v1CertGen = new X509v1CertificateBuilder(

new X500Name("CN=Test"),

BigInteger.ONE,

startDate, endDate,

new X500Name("CN=Test"),

subPubKeyInfo);

X509CertificateHolder certHolder = v1CertGen.build(sigGen);

} catch (Exception E)

{

}

}

public static void main(String[] args) throws Exception {

System.out.println("CertificationCreator!");

X509CertificateCreator X509C = new X509CertificateCreator();

X509C.creation();

}

}

解决方案

You should probably include bctest-jdk15on-147.jar ( http://www.bouncycastle.org/download/bctest-jdk15on-147.jar) in your class path .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Java 代码生成后缀为.cer格式的国密证书的示例: ```java import java.io.FileOutputStream; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.Security; import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.cert.X509CertificateHolder; import org.bouncycastle.cert.jcajce.JcaCertStore; import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder; import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; import org.bouncycastle.cert.jcajce.JcaContentSignerBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.operator.jcajce.JcaContentVerifierProviderBuilder; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; import org.bouncycastle.util.encoders.Base64; public class GenerateCer { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 生成密钥对 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("EC", "BC"); keyPairGen.initialize(256); KeyPair keyPair = keyPairGen.generateKeyPair(); // 创建证书 X500Name issuer = new X500Name("CN=Test CA"); X500Name subject = new X500Name("CN=Test Certificate"); JcaX509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(issuer, BigInteger.valueOf(1), new Date(System.currentTimeMillis() - 10000), new Date(System.currentTimeMillis() + 10000), subject, keyPair.getPublic()); JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder("SM3WITHSM2"); ContentSigner signer = csBuilder.build(keyPair.getPrivate()); X509CertificateHolder certHolder = certBuilder.build(signer); X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certHolder); // 保存证书为 CER 格式 byte[] encodedCert = cert.getEncoded(); FileOutputStream fos = new FileOutputStream("test.cer"); fos.write(Base64.encode(encodedCert)); fos.close(); // 验证证书 cert.checkValidity(new Date()); cert.verify(cert.getPublicKey(), "BC"); } } ``` 这个例子使用 Bouncy Castle 提供的 API生成密钥对和证书,并将证书保存为 CER 格式。其中,`SM3WITHSM2` 是签名算法,可以根据需要替换为其他支持的国密签名算法。生成证书文件名为 `test.cer`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值