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

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/ca1m0921/article/details/82894183

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

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

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

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签发.");
		}
	}
}

显示如下:

未完待续。

猜你喜欢

转载自blog.csdn.net/ca1m0921/article/details/82894183
今日推荐