【5.如何验证 数字证书的有效性】

本文介绍如何使用Java代码验证数字证书的正确性和来源。通过从吾爱网站和优快云下载的末端证书及上级CA证书,演示了如何读取CA公钥,使用公钥验证证书,区分真实与伪造证书。

1. 数字证书由 CA 签发给用户,CA 保证它的安全和可靠性,使用CA的私钥对证书进行签名,使用 CA的公钥验证签名。

通过Java的代码演示,分别从 吾爱 网站下载了 它的末端证书、它的上级CA证书,以及 从 优快云下载了 末端证书。

使用 吾爱的 上级CA 分别验证 吾爱的用户证书 和 优快云的用户证书,查看区别。

 

package verify;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PublicKey;
import java.security.SignatureException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;

public class Verify_cert {

	/**
	 * 验证 CA 颁发的证书
	 * 1. 读取 CA 证书的公钥
	 * 2. 读取已签名的证书
	 * 3. 使用 公钥验证证书
	 * 
	 * 4. 附加,一个假的证书测试,是否有效
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		
		String ca_path = "C:\\Users\\Administrator\\Desktop\\ttt\\Cert_test\\ca_52.cer";
		String ra_path = "C:\\Users\\Administrator\\Desktop\\ttt\\Cert_test\\user_52.cer";
		String ra_path_fake = "C:\\Users\\Administrator\\Desktop\\ttt\\Cert_test\\user_csdn.cer";
		
		verify_cert(ca_path, ra_path, ra_path_fake);
	}
	/**
	 * 1. 使用 CA 的公钥 验证 证书
	 * @param ca_52_path
	 * @param user_52_path
	 * @param user_csdn_path
	 * @throws InvalidKeyException
	 * @throws CertificateException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchProviderException
	 * @throws FileNotFoundException
	 */
	public static void verify_cert(String ca_52_path,String user_52_path,String user_csdn_path) throws InvalidKeyException, CertificateException, NoSuchAlgorithmException, NoSuchProviderException, FileNotFoundException{
		
		//  证书实例,将文件输入流 转换为 证书
		CertificateFactory cf = CertificateFactory.getInstance("X.509");
			
		// 读取 ca 证书 文件,获取证书的 公钥
		FileInputStream fis_ca = new FileInputStream(new File(ca_52_path));
		Certificate ca_52_cert = cf.generateCertificate(fis_ca);
		PublicKey ca_52_publicKey = ca_52_cert.getPublicKey();
		
		// 读取末端证书,获取证书
		FileInputStream fis_ra = new FileInputStream(new File(user_52_path));
		FileInputStream fis_ra_fake = new FileInputStream(new File(user_csdn_path));	
		Certificate user_52_cert = cf.generateCertificate(fis_ra);
		Certificate user_csdn_cert = cf.generateCertificate(fis_ra_fake);
		
		// 验证证书是由 某公钥签发的:使用公钥对 该证书信息解密得到签名值 一致,或者 使用公钥对 签名值 解密,得到 证书信息一致
		try {
			user_52_cert.verify(ca_52_publicKey);
		} catch (SignatureException e) {
			System.out.println("该证书不属于 此CA签发.");
		}
		System.out.println("该证书 属于 此CA签发");
		try {
			user_csdn_cert.verify(ca_52_publicKey);
		} catch (SignatureException e) {
			System.out.println("该证书不属于 此CA签发.");
		}
	}
}

显示如下:

未完待续。

### 验证数字证书有效性的方法及工具 #### 1. 数字证书有效性验证方法 数字证书有效性验证通常包括以下几个方面: - **检查有效期**:验证证书是否在有效期内。如果当前时间不在证书的“开始日期”和“结束日期”之间,则证书无效[^3]。 - **验证签名**:通过 CA 的公钥解密证书中的签名,确保证书内容未被篡改。如果签名验证失败,则证书不可信[^2]。 - **验证颁发者身份**:确认颁发证书CA 是否可信。这通常需要检查本地信任库中是否存在该 CA 的根证书[^1]。 - **吊销状态检查**:通过证书吊销列表(CRL)或在线证书状态协议(OCSP)验证证书是否已被吊销[^3]。 #### 2. 验证数字证书有效性的代码示例 以下是一个使用 Java 验证数字证书有效性的代码示例: ```java import java.io.File; import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateNotYetValidException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; public class CertificateUtil { public static void verifyCertificate(File certificateFile, File caCertFile) throws Exception { // 加载证书 CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate) certFactory.generateCertificate(certificateFile.getInputStream()); // 加载CA证书 X509Certificate caCert = (X509Certificate) certFactory.generateCertificate(caCertFile.getInputStream()); // 验证证书链 cert.verify(caCert.getPublicKey()); // 检查证书有效期 cert.checkValidity(); } public static void main(String[] args) { try { verifyCertificate(new File("/home/zhangzz/Downloads/_.csdn.crt"), new File("/home/zhangzz/Downloads/GeoTrust CN RSA CA G1.p7c")); System.out.println("证书有效"); } catch (CertificateNotYetValidException e) { System.out.println("证书有效期未开始,请待进入有效期后开始使用:" + e.getMessage()); } catch (CertificateExpiredException e) { System.out.println("证书已过期:" + e.getMessage()); } catch (Exception e) { System.out.println("证书验证失败:" + e.getMessage()); } } } ``` #### 3. 验证数字证书有效性的工具 以下是几种常用的数字证书有效性验证工具: - **OpenSSL**:支持多种操作,包括证书解析、验证和吊销状态检查。例如,使用以下命令可以查看证书信息并验证有效性: ```bash openssl x509 -in certificate.pem -text -noout openssl verify -CAfile ca-cert.pem certificate.pem ``` - **Keytool**:Java 提供的工具,用于管理密钥库和证书。可以使用以下命令验证证书: ```bash keytool -printcert -v -file certificate.cer ``` - **在线工具**:如 SSL Labs 的 SSL Test 工具,可以在线分析 HTTPS 网站的证书配置和有效性[^3]。 #### 4. 商用密码数字证书合格检测工具 商用密码数字证书的合格检测工具主要用于评估数字证书的正确性、有效性和合规性。例如,在身份认证中,需要确保数字证书的使用符合相关标准和法规要求。SM2 数字证书是基于国密算法的标准证书,其检测工具需支持 SM2 算法的解析和验证[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值