java校验证书链

/**
* @param certInfo 证书链.P7B文件的文本内容
* @param rootCA 用户信任的顶级根证书PEM文件文本内容,头尾不能少
* @param subjectName 当前证书的使用者

 * @return Boolean
 * @throws Exception
 */
public static boolean verifyCerChains(String certInfo, String rootCA, String subjectName) throws Exception {

    //用户信任的顶级根证书
    X509Certificate X509certificateRoot = getRootCA(rootCA);

    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    CMSSignedData sd = new CMSSignedData(Base64.decodeBase64(certInfo));
    Store<X509CertificateHolder> store = sd.getCertificates();

    Collection<X509CertificateHolder> certChains = store.getMatches(null);

    //获取证书链长度
    int nSize = certChains.size();
    //将证书链转化为数组
    X509Certificate[] arX509certificate = new X509Certificate[certChains.size()];
    int j = 0;
    for (X509CertificateHolder holder : certChains) {
        arX509certificate[j++] = new JcaX509CertificateConverter().setProvider("BC").getCertificate(holder);
    }

    //声明list,存储证书链中证书主体信息
    ArrayList list = new ArrayList();
    //沿证书链自上而下,验证证书的所有者是下一个证书的颁布者
    Principal principalLast = null;
    //遍历arX509certificate
    for (int i = 0; i < nSize; i++) {

        X509Certificate x509Certificate = arX509certificate[i];
        //获取发布者标识
        Principal principalIssuer = x509Certificate.getIssuerDN();
        //获取证书的主体标识
        Principal principalSubject = x509Certificate.getSubjectDN();
        //保存证书的序列号
        list.add(x509Certificate.getSerialNumber());
        //使用者
        String certchainsUsers = String.valueOf(x509Certificate.getSubjectDN().getName());
        System.out.println(certchainsUsers);
        if (principalLast != null) {
            //验证证书的颁布者是上一个证书的所有者
            if (principalIssuer.equals(principalLast)) {
                try {
                    //获取上个证书的公钥
                    PublicKey publickey = arX509certificate[i - 1].getPublicKey();
                    //验证是否已使用与指定公钥相应的私钥签署了此证书
                    arX509certificate[i].verify(publickey);
                } catch (Exception e) {
                    return false;
                }
            } else {
                return false;
            }
        }
        principalLast = principalSubject;

    }

    //证明证书链中的第一个证书由用户所信任的CA颁布
    try {
        PublicKey publickey = X509certificateRoot.getPublicKey();
        arX509certificate[0].verify(publickey);
    } catch (Exception e) {
        return false;
    }
    //证明证书链中的最后一个证书的所有者正是现在通信对象
    Principal principalSubject = arX509certificate[nSize - 1].getSubjectDN();
    if (!subjectName.equals(principalSubject.getName())) {
        return false;
    }

    //验证证书链里每个证书是否在有效期里
    Date date = new Date();
    for (int i = 0; i < nSize; i++) {
        try {
            arX509certificate[i].checkValidity(date);
        } catch (Exception e) {
            return false;
        }
    }
    return true;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,可以使用 Java Cryptography Architecture (JCA) 提供的 X.509 证书库来实现根据证书校验公钥证书是否合法。以下是一个简单的示例代码: ```java import java.io.FileInputStream; import java.security.cert.CertPath; import java.security.cert.CertPathValidator; import java.security.cert.CertPathValidatorException; import java.security.cert.CertPathValidatorResult; import java.security.cert.CertPathValidatorSpi; import java.security.cert.CertificateFactory; import java.security.cert.PKIXParameters; import java.security.cert.X509Certificate; import java.util.Arrays; public class CertificateValidator { public static boolean validate(X509Certificate cert, X509Certificate[] chain) throws Exception { // 创建证书工厂并加载证书 CertificateFactory cf = CertificateFactory.getInstance("X.509"); CertPath certPath = cf.generateCertPath(Arrays.asList(chain)); // 创建 PKIX 参数,并禁用 CRL 检查 PKIXParameters params = new PKIXParameters(cert.getPublicKey()); params.setRevocationEnabled(false); // 创建证书路径验证器并验证证书 CertPathValidator cpv = CertPathValidator.getInstance("PKIX"); CertPathValidatorResult cpvr = cpv.validate(certPath, params); return cpvr != null; } public static void main(String[] args) throws Exception { // 加载根证书和待验证证书 X509Certificate rootCert = (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream("root.cer")); X509Certificate cert = (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream("cert.cer")); // 构建证书 X509Certificate[] chain = new X509Certificate[] {cert, rootCert}; // 验证证书 boolean isValid = validate(cert, chain); System.out.println("Certificate is " + (isValid ? "valid" : "invalid")); } } ``` 在上述代码中,`validate` 方法接收待验证的公钥证书证书作为参数,使用 PKIX 参数创建证书路径验证器,并调用 `validate` 方法验证证书。在 `main` 方法中,我们加载根证书和待验证证书,构建证书,然后调用 `validate` 方法进行证书验证。最终输出证书是否合法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值