密码技术学习(8.4)-在Java中使用证书

本文介绍如何使用keytool生成密钥及证书,并通过Java代码演示了密钥库的加载、证书工厂的使用、证书路径生成等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备测试数据

1)准备密钥

keytool -genkey -keystore "shaozuo.keystore" -alias shaozuoKey -keyalg RSA -validity 365 -dname "CN=shaozuo, OU=shaozuo, O=shaozuo, L=Beijing, ST=Beijing, C=CN" -keypass shaozuo -storepass shaozuo

2)导出证书

keytool -alias shaozuoKey -exportcert -keystore shaozuo.keystore -file shaozuo_pub.cer -storepass shaozuo

测试代码

SecurityCertTest

mport static org.junit.Assert.assertEquals;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.CRL;
import java.security.cert.CertPath;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Collection;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.Ignore;
import org.junit.Test;

import com.google.common.collect.Lists;

/**
 * 证书测试
 * 
 * @author shaozuo
 *
 */
public class SecurityCertTest {

	private static final String X_509 = "X.509";
	static {
		Security.insertProviderAt(new BouncyCastleProvider(), 1);
	}

	@Test
	public void testKeyStore() throws GeneralSecurityException, IOException {
		File file = new File("src/test/resources/shaozuo.keystore");
		if (file.exists()) {
			FileInputStream is = new FileInputStream(file);
			KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
			keyStore.load(is, "shaozuo".toCharArray());
			is.close();

			PrivateKey key = (PrivateKey) keyStore.getKey("shaozuoKey", "shaozuo".toCharArray());
			System.out.println(key.getAlgorithm());
		}

	}

	/**
	 * @throws GeneralSecurityException
	 * @throws IOException
	 */
	@Test
	public void testCertificateFactory() throws GeneralSecurityException, IOException {
		CertificateFactory certificateFactory = CertificateFactory.getInstance(X_509);
		File file = new File("src/test/resources/shaozuo_pub.cer");
		if (file.exists()) {
			FileInputStream is = new FileInputStream(file);
			Certificate certificate = certificateFactory.generateCertificate(is);
			is.close();
			// System.out.println(certificate.getPublicKey().getAlgorithm());
			if (StringUtils.equals(X_509, certificate.getType())) {
				X509Certificate cX509Certificate = (X509Certificate) certificate;
				// System.out.println(cX509Certificate.toString());
				assertEquals(CryptoAlgorithm.RSA.name(),
				        cX509Certificate.getPublicKey().getAlgorithm());
			}
		}
	}

	/**
	 * 测试证书吊销列表
	 * 
	 * 
	 * @throws GeneralSecurityException
	 * @throws IOException
	 */
	@Test
	@Ignore
	public void testCRL() throws GeneralSecurityException, IOException {
		// TODO 找到生成吊销列表的方法
		CertificateFactory certificateFactory = CertificateFactory.getInstance(X_509);
		File file = new File("src/test/resources/shaozuo.keystore");
		if (file.exists()) {
			FileInputStream is = new FileInputStream(file);
			CRL crl = certificateFactory.generateCRL(is);
			is.close();
			System.out.println(crl.toString());
		}
	}

	/**
	 * 测试CertPath
	 * 
	 * 
	 * @throws GeneralSecurityException
	 * @throws IOException
	 */
	@Test
	public void testGenCertPathByCerts() throws GeneralSecurityException, IOException {
		CertificateFactory certificateFactory = CertificateFactory.getInstance(X_509);
		File file = new File("src/test/resources/laozhai_pub.p7b");
		if (file.exists()) {
			FileInputStream is = new FileInputStream(file);
			Collection<? extends Certificate> certificates = certificateFactory
			        .generateCertificates(is);
			// the List of Certificates
			List<? extends Certificate> certs = Lists.newArrayList(certificates);
			System.out.println(certs.size());
			CertPath certPath = certificateFactory.generateCertPath(certs);
		}
	}

	/**
	 * 测试CertPath
	 * 
	 * 
	 * @throws GeneralSecurityException
	 * @throws IOException
	 */
	@Test
	public void testGenCertPathByInput() throws GeneralSecurityException, IOException {
		CertificateFactory certificateFactory = CertificateFactory.getInstance(X_509);
		File file = new File("src/test/resources/laozhai_pub.p7b");
		if (file.exists()) {
			FileInputStream is = new FileInputStream(file);
			CertPath certPath = certificateFactory.generateCertPath(is, "PKCS7");
			is.close();
		}
	}

	/**
	 * 测试CertPath
	 * 
	 * 
	 * @throws GeneralSecurityException
	 * @throws IOException
	 */
	@Test
	public void testGenCertPathByInputCer() throws GeneralSecurityException, IOException {
		CertificateFactory certificateFactory = CertificateFactory.getInstance(X_509);
		File file = new File("src/test/resources/laozhai_pub.cer");
		if (file.exists()) {
			FileInputStream is = new FileInputStream(file);
			CertPath certPath = certificateFactory.generateCertPath(is, "PKCS7");
			is.close();
		}
	}

	/**
	 * 测试Certificates
	 * 
	 * 
	 * @throws GeneralSecurityException
	 * @throws IOException
	 */
	@Test
	public void testCertificates() throws GeneralSecurityException, IOException {
		CertificateFactory certificateFactory = CertificateFactory.getInstance(X_509);
		File file = new File("D:\\program_language\\Java\\jre1.8.0_171\\lib\\security\\cacerts");
		if (file.exists()) {
			FileInputStream is = new FileInputStream(file);
			KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
			keyStore.load(is, "changeit".toCharArray());
			is.close();

		}
	}
}

本系列其他文章

密码技术学习系列文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值