【PKI】3.验证 数字证书的有效性
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签发."); } } }
显示如下:

未完待续…