工作证书对根证书的验证主要是验证根证书的公钥。
已知根证书的格式为pem,工作证书格式为crt,验证流程为
1、读取根证书pem文件,获取根证书公钥;
2、读取工作证书文件,获取工作证书;
3、使用工作证书验证根证书公钥,验证通过,则说明该工作证书是根证书下发的
具体代码片段如下:
/**
* 根据根证书获取根证书公钥
*
* @param rootCertPath 根证书路径
* @return
* @throws Exception
*/
public static PublicKey getRootCertPublicKeyFromPem(String rootCertPath) throws Exception {
FileInputStream fis = new FileInputStream(new File(rootCertPath));
CertificateFactory ft = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) ft.generateCertificate(fis);
PublicKey publicKey = certificate.getPublicKey();
return publicKey;
}
// 从读到的工作证书临时缓存文件中获取到工作证书
FileInputStream fis = new FileInputStream(new File(workCertTmpPath));
CertificateFactory ft = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) ft.generateCertificate(fis);
/**
* 使用用户证书验证根证书的公钥,如果验证通过说明这个用户证书是这个根证书签发的,验证不过就不是这个根证书签发的。
*
* @param rootCert
* @param publicKey 根证书公钥
* @return
*/
public static boolean verifyRootCerUseWorkCert(X509Certificate workCert, PublicKey publicKey) {
if (workCert == null || publicKey == null) {
return false;
} else {
try {
workCert.checkValidity(); // to check it's valid in time
workCert.verify(publicKey); // verify the sig. using the issuer's public key
// 走到这一步,说明验证成功
return true;
} catch (CertificateExpiredException e) {
e.printStackTrace();
} catch (CertificateNotYetValidException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
}
// 如果发生异常,则说明验证失败
return false;
}
}