java相关证书_java实现安全证书相关操作

该博客主要展示了如何使用Java进行安全证书相关操作,包括读取KeyStore中的私钥、公钥和签名信息,创建新的KeyStore,加载并签发证书,以及验证证书等。示例代码详细解释了如何进行X509证书的信息读取和处理。
摘要由CSDN通过智能技术生成

package test;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.PrintStream;

import java.security.Key;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.KeyStore;

import java.security.Principal;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.SecureRandom;

import java.security.Signature;

import java.security.cert.Certificate;

import java.security.cert.CertificateException;

import java.security.cert.CertificateFactory;

import java.security.cert.CertificateFactorySpi;

import java.security.cert.X509Certificate;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Collection;

import java.util.Date;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import org.junit.Test;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

import sun.security.pkcs.ContentInfo;

import sun.security.pkcs.PKCS10;

import sun.security.pkcs.PKCS7;

import sun.security.tools.KeyStoreUtil;

import sun.security.x509.AlgorithmId;

import sun.security.x509.CertificateAlgorithmId;

import sun.security.x509.CertificateIssuerName;

import sun.security.x509.CertificateSerialNumber;

import sun.security.x509.CertificateSubjectName;

import sun.security.x509.CertificateValidity;

import sun.security.x509.CertificateVersion;

import sun.security.x509.CertificateX509Key;

import sun.security.x509.X500Name;

import sun.security.x509.X500Signer;

import sun.security.x509.X509CertImpl;

import sun.security.x509.X509CertInfo;

public class ReadKeyStoreTest {

/**

* 列出store中所有的私钥和公钥 以及签名信息

*

* @param ks

* @param storePass

* @param priKeyPass

* @throws Exception

*/

private void listKeyAndCertificate(KeyStore ks, String storePass,

String priKeyPass) throws Exception {

System.out.println("size=" + ks.size());

Enumeration enum1 = ks.aliases();

int i = 0;

while (enum1.hasMoreElements()) {

String alias = enum1.nextElement();

System.out.println("第" + (++i) + "个");

System.out.println("alias=" + alias);

java.security.cert.Certificate c = ks.getCertificate(alias);// alias为条目的别名

readX509Certificate((X509Certificate) c);

readPriKey(ks, alias, priKeyPass);

}

}

/**

* 列出store中私钥和cert chain信息

*

* @param ks

* @param alias

* @param pass

* @throws Exception

*/

private void readPriKey(KeyStore ks, String alias, String pass)

throws Exception {

Key key = ks.getKey(alias, pass.toCharArray());

if (null == key) {

System.out.println("no priviate key of " + alias);

return;

}

System.out.println();

System.out.println("algorithm=" + key.getAlgorithm());

System.out.println("format=" + key.getFormat());

System.out.println("toString=" + key);

readCertChain(ks, alias);

}

/**

* 列出store中 cert chain信息

*

* @param ks

* @param alias

* @throws Exception

*/

private void readCertChain(KeyStore ks, String alias) throws Exception {

Certificate[] certChain = ks.getCertificateChain(alias);

System.out.println("chain of " + alias);

if (null == certChain) {

System.out.println("no chain");

return;

}

int i = 0;

for (Certificate c : certChain) {

System.out.println("index " + (i++) + " in chain of " + alias);

readX509Certificate((X509Certificate) c);

}

}

/**

* 列出x509Certificate的基本信息

*

* @param t

*/

private void readX509Certificate(X509Certificate t) {

System.out.println(t);

System.out.println("输出证书信息:\n" + t.toString());

System.out.println("版本号:" + t.getVersion());

System.out.println("序列号:" + t.getSerialNumber().toString(16));

System.out.println("主体名:" + t.getSubjectDN());

System.out.println("签发者:" + t.getIssuerDN());

System.out.println("有效期:" + t.getNotBefore());

System.out.println("签名算法:" + t.getSigAlgName());

byte[] sig = t.getSignature();// 签名值

PublicKey pk = t.getPublicKey();

byte[] pkenc = pk.getEncoded();

System.out.println("签名 :");

for (int i = 0; i 

System.out.print(sig[i] + ",");

System.out.println();

System.out.println("公钥: ");

for (int i = 0; i 

System.out.print(pkenc[i] + ",");

System.out.println();

}

/**

* 创建一个新的keystore

*

* @param storePass

* @param storeType

*            PKCS12/JKS

* @return

* @throws Exception

*/

private KeyStore createKeyStore(String storePass, String storeType)

throws Exception {

KeyStore ks = KeyStore.getInstance(storeType);

ks.load(null, storePass.toCharArray());

return ks;

}

/**

* 加载一个已有的keyStore

*

* @param path

* @param storePass

* @param storeType

*            PKCS12/JKS

* @return

* @throws Exception

*/

private KeyStore loadKeyStore(String path, String storePass,

String storeType) throws Exception {

FileInputStream in = new FileInputStream(path);

KeyStore ks = KeyStore.getInstance(storeType);

ks.load(in, storePass.toCharArray());

in.close();

return ks;

}

/**

* 从文件加载一个证书

*

* @param path

* @param certType

* @return

* @throws Exception

*/

private Certificate loadCert(String path, String certType) throws Exception {

CertificateFactory cf = CertificateFactory.getInstance(certType);

FileInputStream in = new FileInputStream(path);

Certificate c = cf.generateCertificate(in);

in.close();

return c;

}

/**

* 生成一个由根证书签名的store

*

* @param rootStore

* @param rootAlias

* @param rootKeyPass

* @param subjectStr

* @param storeType

* @param storePass

* @param alg

* @param keySize

* @param keyPass

* @return

* @throws Exception

*/

public KeyStore generateSignedKeyStore(KeyStore rootStore,

String rootAlias, String rootKeyPass, String subjectStr,

String storeType, String storePass, String alias, String alg,

int keySize, String keyPass) throws Exception {

PrivateKey rootKey = null;

X509CertImpl rootCert = null;

X509CertInfo rootInfo = null;

CertificateSubjectName rootsubject = null;

// 签发者

X500Name issueX500Name = new X500Name(subjectStr);

if (null != rootStore) {

rootKey = (PrivateKey) rootStore.getKey(rootAlias,

rootKeyPass.toCharArray());

rootCert = (X509CertImpl) rootStore.getCertificate(rootAlias);

rootInfo = (X509CertInfo) rootCert.get(X509CertImpl.NAME + "."

+ X509CertImpl.INFO);

rootsubject = (CertificateSubjectName) rootInfo

.get(X509CertInfo.SUBJECT);

issueX500Name = (X500Name) rootsubject

.get(CertificateIssuerName.DN_NAME);

}

// 签发者

CertificateIssuerName issuerName = new CertificateIssuerName(

issueX500Name);

// 被签发者

X500Name subjectX500Name = new X500Name(subjectStr);

CertificateSubjectName subjectName = new CertificateSubjectName(

subjectX500Name);

// 有效期设置

Calendar calendar = Calendar.getInstance();

Date startDate = calendar.getTime();

calendar.add(Calendar.DATE, 85);

Date endDate = calendar.getTime();

CertificateValidity certificateValidity = new CertificateValidity(

startDate, endDate);

// 序列号

CertificateSerialNumber sn = new CertificateSerialNumber(

(int) (startDate.getTime() / 1000L));

// 版本

CertificateVersion certVersion = new CertificateVersion(

CertificateVersion.V3);

// 算法

// TODO 获取算法的代码有问题

AlgorithmId algorithmId = new AlgorithmId(

"RSA".equals(alg) ? AlgorithmId.sha1WithRSAEncryption_oid

: AlgorithmId.sha1WithDSA_oid);

// 密钥对

KeyPairGenerator keygen = KeyPairGenerator.getInstance(alg);

keygen.initialize(keySize, new SecureRandom());

KeyPair kp = keygen.genKeyPair();

X509CertInfo certInfo = new X509CertInfo();

certInfo.set("version", certVersion);

certInfo.set("serialNumber", sn);

// localX500Signer.getAlgorithmId();

certInfo.set("algorithmID", new CertificateAlgorithmId(algorithmId));

certInfo.set("key", new CertificateX509Key(kp.getPublic()));

certInfo.set("validity", certificateValidity);

certInfo.set("subject", subjectName);

certInfo.set("issuer", issuerName);

// 扩展信息

// if (System.getProperty("sun.security.internal.keytool.skid") !=

// null)

// {

// CertificateExtensions localCertificateExtensions = new

// CertificateExtensions();

// localCertificateExtensions.set("SubjectKeyIdentifier", new

// SubjectKeyIdentifierExtension(new

// KeyIdentifier(this.publicKey).getIdentifier()));

// certInfo.set("extensions", localCertificateExtensions);

// }

X509CertImpl newcert = new X509CertImpl(certInfo);

// TODO 这里的签名算法可能有问题 貌似应该用rootcert的签名算法 待测试

KeyStore ks = this.createKeyStore(storePass, storeType);

Certificate[] certChain = null;

// 如果rootStore为空 则生成自签名证书

if (null == rootStore) {

newcert.sign(kp.getPrivate(), "SHA1WithRSA");

certChain = new Certificate[] { newcert };

} else {

newcert.sign(rootKey, "SHA1WithRSA");

certChain = new Certificate[] { newcert, rootCert };

}

// ks.setCertificateEntry("zrbin", newcert);

ks.setKeyEntry(alias, kp.getPrivate(), keyPass.toCharArray(), certChain);

return ks;

}

@Test

public void testReadCer() throws Exception {

String path = "d:\\test.cer";

String certType = "X.509";

CertificateFactory cf = CertificateFactory.getInstance(certType);

FileInputStream in = new FileInputStream(path);

Collection cs = (Collection) cf

.generateCertificates(in);

in.close();

System.out.println("size=" + cs.size());

for (Certificate c : cs) {

readX509Certificate((X509Certificate) c);

}

}

@Test

public void testReadP12() throws Exception {

String storePass = "123456";

String keyPass = "123456";

String path = "d:\\zrbin.p12";

KeyStore ks = loadKeyStore(path, storePass, "PKCS12");

listKeyAndCertificate(ks, storePass, keyPass);

}

@Test

public void testReadKeyStore() throws Exception {

String storePass = "123456";

String keyPass = "123456";

String path = "d:\\test.keystore";

KeyStore ks = loadKeyStore(path, storePass, "JCEKS");

listKeyAndCertificate(ks, storePass, keyPass);

}

@Test

public void testExportCert() throws FileNotFoundException, Exception {

String pass = "123456";

FileInputStream in = new FileInputStream("d:\\zrbin.p12");

boolean rfc = true;

KeyStore ks = KeyStore.getInstance("PKCS12");

ks.load(in, pass.toCharArray());

Certificate cert = ks.getCertificate("zrbin");

PrintStream out = new PrintStream("D:\\zrbin.cer");

if (rfc) {

BASE64Encoder encoder = new BASE64Encoder();

out.println("-----BEGIN CERTIFICATE-----");

encoder.encodeBuffer(cert.getEncoded(),

out);

out.println("-----END CERTIFICATE-----");

} else {

out.write(cert.getEncoded());

}

out.write(cert.getEncoded());

}

@Test

public void testImportCert() throws Exception {

CertificateFactory cf = CertificateFactory.getInstance("X.509");

FileInputStream storeIn = new FileInputStream("d:\\server.keystore");

FileInputStream in = new FileInputStream("d:\\zrbin.cer");

FileInputStream rootin = new FileInputStream("d:\\root.cer");

X509CertImpl cert = (X509CertImpl) cf.generateCertificate(in);

X509CertImpl rootcert = (X509CertImpl) cf.generateCertificate(rootin);

KeyStore ks = KeyStore.getInstance("JKS");

ks.load(null, "123456".toCharArray());

ks.deleteEntry("zrbin");

// ks.setCertificateEntry("zrbin", cert);

ks.setCertificateEntry("root", rootcert);

in.close();

FileOutputStream out = new FileOutputStream("d:\\server.keystore");

ks.store(out, "123456".toCharArray());

}

@Test

public void testImportSigenedCert() throws Exception {

String alias = "test";

CertificateFactory cf = CertificateFactory.getInstance("X.509");

FileInputStream storeIn = new FileInputStream("d:\\test.keystore");

KeyStore ks = KeyStore.getInstance("JKS");

ks.load(storeIn, "123456".toCharArray());

PrivateKey priKey = (PrivateKey) ks.getKey(alias,

"123456".toCharArray());

FileInputStream in = new FileInputStream("d:\\test.cer");

Collection certCollection = (Collection) cf

.generateCertificates(in);

System.out.println(certCollection.size());

if (certCollection.size() == 0) {

System.out.println("没有要导入的证书");

return;

}

// 如果没有对应的私钥,直接导入certficateEntry

if (null == priKey) {

for (Certificate _cert : certCollection) {

ks.setCertificateEntry(alias, _cert);

break;

}

} else {

Certificate importCert = null;

for (Certificate cert : certCollection) {

if (ks.getCertificate(alias).getPublicKey()

.equals(cert.getPublicKey())) {

importCert = cert;

break;

}

}

if (null == importCert) {

System.out.println("错误:no replay cert");

}

certCollection.remove(importCert);

if (X509CertImpl.isSelfSigned((X509Certificate) importCert, null)) {

System.out.println("证书未被ca签名,无需导入");

} else {

// 构建认证链

List certList = new ArrayList(

ks.size());

Map cerMap = new HashMap();

Enumeration aliasEnum = ks.aliases();

// 把不包括当前回复的都加到map里

while (aliasEnum.hasMoreElements()) {

String _alias = aliasEnum.nextElement();

if (!_alias.equals(alias)) {

X509CertImpl _cert = (X509CertImpl) ks

.getCertificate(_alias);

cerMap.put(_cert.getSubjectDN(), _cert);

}

}

for (Certificate cert : certCollection) {

cerMap.put(((X509Certificate) cert).getSubjectDN(), cert);

}

certList.add(importCert);

Principal issuerName = ((X509Certificate) importCert)

.getIssuerDN();

while (cerMap.keySet().contains(issuerName)) {

X509Certificate _rootCert = (X509Certificate) cerMap

.remove(issuerName);

if (null == _rootCert) {

System.out.println(issuerName + "的根证书为空");

return;

}

certList.add(_rootCert);

issuerName = _rootCert.getIssuerDN();

}

X509CertImpl rootCert = (X509CertImpl) certList.get(certList

.size() - 1);

if (!X509CertImpl.isSelfSigned(rootCert, null)) {

System.out.println("构建证书链错误,请先导入颁发者(" + issuerName

+ ")的CA证书");

return;

}

Certificate[] certChain = certList

.toArray(new Certificate[certList.size()]);

ks.setKeyEntry(alias, priKey, "123456".toCharArray(), certChain);

}

}

in.close();

FileOutputStream out = new FileOutputStream("d:\\test.keystore");

ks.store(out, "123456".toCharArray());

out.close();

}

@Test

public void testGenerateKeyStore() throws Exception {

KeyPairGenerator kg = KeyPairGenerator.getInstance("RSA");

KeyPair kp = kg.genKeyPair();

System.out.println(KeyStoreUtil.niceStoreTypeName("PKCS12"));

System.out.println(kp.getPrivate());

System.out.println(kp.getPublic());

KeyStore ks = KeyStore.getInstance("JKS");

}

@Test

public void testX500Name() throws IOException, CertificateException {

// for(byte i=48;i<=57;i++){

// System.out.println((char)i);

// }

// RFC 1779 (CN, L, ST, O, OU, C, STREET)

// RFC 2253 (CN/name, L/location, ST/station, O/org, OU/orgunit,

// C/country, STREET, DC, UID)

X500Name subjectName = new X500Name(

"CN=www.jiangtech.com,L=ZuChongZhi road,ST=Shang Hai,O=Jiangdatech,OU=ENTERPRISE APP,C=China,STREET=ZuChongZhi Road");

X500Name subjectName1 = new X500Name(

"CN=www.jiangtech.com,L=ZuChongZhi road,ST=Shang Hai,O=Jiangdatech,OU=ENTERPRISE APP,C=China,STREET=ZuChongZhi Road");

// X509CertInfo certInfo = new X509CertInfo();

// certInfo.set(X509CertInfo.SUBJECT, new CertificateSubjectName(

// subjectName));

System.out.println(subjectName.hashCode());

System.out.println(subjectName1.hashCode());

}

/**

* 证书验证

*

* @throws Exception

*/

@Test

public void testValidate() throws Exception {

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");

// kpg.initialize()

KeyPair kp = kpg.genKeyPair();

KeyStore rootStore = this.loadKeyStore("d:/root.keystore", "123456",

"JKS");

PrivateKey rootKey = (PrivateKey) rootStore.getKey("jdcert",

"123456".toCharArray());

KeyStore store1 = this.loadKeyStore("d:/jd_signed.keystore", "123456",

"JKS");

X509CertImpl rootCert = (X509CertImpl) rootStore

.getCertificate("jdcert");

X509CertInfo rootInfo = (X509CertInfo) rootCert.get(X509CertImpl.NAME

+ "." + X509CertImpl.INFO);

CertificateSubjectName rootsubject = (CertificateSubjectName) rootInfo

.get(X509CertInfo.SUBJECT);

Certificate[] chain = rootStore.getCertificateChain("jdcert");

rootCert.verify(kp.getPublic());

}

/**

* 测试签发证书

*/

@Test

public void testGenerateSignedKeyStore() {

try {

KeyStore rootStore = this.loadKeyStore("d:/root.keystore",

"123456", "JKS");

String rootAlias = "test";

String subjectStr = "CN=zhaorb@jiangdatech.com,L=PU Dong,ST=Shang Hai,O=Jiangdatech,OU=ENTERPRISE APP,C=China,STREET=ZuChongZhi Road";

String alg = "RSA";

String storeType = "JKS";

int keySize = 1024;

String keyPass = "123456";

String rootKeyPass = "123456";

String storePass = "123456";

String alias = "test";

KeyStore ks = this.generateSignedKeyStore(null, rootAlias,

rootKeyPass, subjectStr, storeType, storePass, alias, alg,

keySize, keyPass);

OutputStream out = new FileOutputStream(

new File("d:/test.keystore"));

ks.store(out, "123456".toCharArray());

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 测试签发证书

*/

@Test

public void testGenerateSecKeyStore() {

try {

String rootAlias = "test";

String subjectStr = "CN=zhaorb@jiangdatech.com,L=PU Dong,ST=Shang Hai,O=Jiangdatech,OU=ENTERPRISE APP,C=China,STREET=ZuChongZhi Road";

String alg = "DES";

String storeType = "JKS";

int keySize = 1024;

String keyPass = "123456";

String rootKeyPass = "123456";

String storePass = "123456";

String alias = "test";

KeyStore ks = this.createKeyStore("123456", "JCEKS");

KeyGenerator keygen = KeyGenerator.getInstance("DES");

SecretKey secKey = keygen.generateKey();

ks.setKeyEntry(alias, secKey, "123456".toCharArray(),null);

OutputStream out = new FileOutputStream(

new File("d:/test.keystore"));

ks.store(out, "123456".toCharArray());

} catch (Exception e) {

e.printStackTrace();

}

}

@Test

/**

* 关于p7b的操作 未实现

*/

public void testGeneratePKCS7KeyStore() {

try {

/*ContentInfo info = new ContentInfo(arg0);

//PKCS7 pkcs7 = new PKCS7()

String rootAlias = "test";

String subjectStr = "CN=zhaorb@jiangdatech.com,L=PU Dong,ST=Shang Hai,O=Jiangdatech,OU=ENTERPRISE APP,C=China,STREET=ZuChongZhi Road";

String alg = "DES";

String storeType = "JKS";

int keySize = 1024;

String keyPass = "123456";

String rootKeyPass = "123456";

String storePass = "123456";

String alias = "test";

KeyStore ks = this.createKeyStore("123456", "PKCS7");

KeyGenerator keygen = KeyGenerator.getInstance("RSA");

//SecretKey secKey = keygen.generateKey();

//ks.setKeyEntry(alias, secKey, "123456".toCharArray(),null);

OutputStream out = new FileOutputStream(

new File("d:/test.keystore"));

ks.store(out, "123456".toCharArray());*/

} catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void testReadJCEKS() throws Exception{

KeyStore ks = this.loadKeyStore("D:/test.keystore","123456", "JCEKS");

Enumeration aliasEnum = ks.aliases();

while(aliasEnum.hasMoreElements()){

String alias = aliasEnum.nextElement();

SecretKeySpec secKey = (SecretKeySpec) ks.getKey(alias, "123456".toCharArray());

System.out.println(ks.getCertificate(alias));

//System.out.println(ks.);

System.out.println(secKey.getClass());

System.out.println(secKey.getFormat());

System.out.println(secKey.getEncoded());

}

}

public PKCS10 readCsr() throws Exception {

File f = new File("D:/test.csr");

InputStream in = new FileInputStream(f);

ByteArrayOutputStream out = new ByteArrayOutputStream(1024);

byte[] bytes = new byte[(int) f.length()];

in.read(bytes);

String base64String = new String(bytes, "ISO-8859-1");

System.out.println(base64String);

Pattern p = Pattern

.compile("-----BEGIN NEW CERTIFICATE REQUEST-----([\\s\\S]*?)-----END NEW CERTIFICATE REQUEST-----([\\s\\S]*)");

BASE64Decoder decoder = new BASE64Decoder();

Matcher m = p.matcher(base64String);

if (m.find()) {

String s = m.group(1);

System.out.println(s.trim());

byte[] bArray = decoder.decodeBuffer(s);

PKCS10 csr = new PKCS10(bArray);

System.out.println(csr);

return csr;

}

throw new Exception("文件错误 ,无法读取csr");

}

@Test

public void testReadCsr() throws Exception {

PKCS10 csr = readCsr();

}

@Test

public void createCsr() throws Exception {

String storePass = "123456";

String alias = "test";

String alg = null;

KeyStore ks = this.loadKeyStore("d:/test.keystore", storePass, "JKS");

Certificate cert = ks.getCertificate(alias);

PrivateKey priKey = (PrivateKey) ks.getKey(alias,

"123456".toCharArray());

PublicKey pubKey = cert.getPublicKey();

PKCS10 csr = new PKCS10(pubKey);

String signAlg = null;

if (alg == null) {

alg = priKey.getAlgorithm();

if (("DSA".equalsIgnoreCase(alg)) || ("DSS".equalsIgnoreCase(alg)))

signAlg = "SHA1WithDSA";

else if ("RSA".equalsIgnoreCase((String) alg))

signAlg = "SHA1WithRSA";

else

throw new Exception("Cannot derive signature algorithm");

}

Signature signature = Signature.getInstance(signAlg);

signature.initSign(priKey);

X500Name x500Name = new X500Name(((X509Certificate) cert)

.getSubjectDN().toString());

X500Signer x500Signer = new X500Signer(signature, x500Name);

((PKCS10) csr).encodeAndSign(x500Signer);

File f = new File("D:/test.csr");

if (f.exists()) {

f.delete();

}

((PKCS10) csr).print(new PrintStream(new File("D:/test.csr")));

}

/**

* 签名

*

* @throws Exception

*/

@Test

public void testSignature() throws Exception {

KeyStore rootStore = this.loadKeyStore("d:/root.keystore", "123456",

"JKS");

PrivateKey rootKey = (PrivateKey) rootStore.getKey("root",

"123456".toCharArray());

X509CertImpl rootX509Cert = (X509CertImpl) rootStore

.getCertificate("root");

X500Name issuerX500Name = (X500Name) rootX509Cert.get(X509CertImpl.NAME

+ "." + X509CertImpl.INFO + "." + X509CertInfo.SUBJECT + "."

+ CertificateSubjectName.DN_NAME);

// 有效期设置

Calendar calendar = Calendar.getInstance();

Date startDate = calendar.getTime();

calendar.add(Calendar.DATE, 85);

Date endDate = calendar.getTime();

CertificateValidity certificateValidity = new CertificateValidity(

startDate, endDate);

// 序列号

CertificateSerialNumber sn = new CertificateSerialNumber(

(int) (startDate.getTime() / 1000L));

PKCS10 csr = this.readCsr();

PublicKey pubKey = csr.getSubjectPublicKeyInfo();

X500Name subjectX500Name = csr.getSubjectName();

// TODO 未实现

Signature signature = Signature.getInstance("Sha1WithRSA");

X500Signer signer = new X500Signer(signature, subjectX500Name);

AlgorithmId algorithmId = signer.getAlgorithmId();

X509CertInfo info = new X509CertInfo();

info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(

algorithmId));

info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(

subjectX500Name));

info.set(X509CertInfo.ISSUER, new CertificateIssuerName(issuerX500Name));

info.set(X509CertInfo.KEY, new CertificateX509Key(pubKey));

info.set(X509CertInfo.VERSION, new CertificateVersion(

CertificateVersion.V3));

info.set(X509CertInfo.VALIDITY, certificateValidity);

info.set(X509CertInfo.SERIAL_NUMBER, sn);

X509CertImpl newCert = new X509CertImpl(info);

newCert.sign(rootKey, "SHA1WithRSA");

OutputStream out = new FileOutputStream("d:/test.cer");

out.write(newCert.getEncoded());

out.write(rootX509Cert.getEncoded());

out.close();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值