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签发.");
}
}
}
显示如下:

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





