SV.CERT.INVALID
必须通过构造证书路径来验证证书。
当使用信任锚生成未经过验证的 X509 证书时,Klocwork 会报告 SV.CERT.INVALID 缺陷。
漏洞与风险
做出明智的信任决策需要路径验证。信赖方不会信任未经过路径验证的证书。
信任锚是通过公钥及其关联数据表示的权威实体。信任锚在公钥基础设施、X.509 数字证书和 DNSSEC 的上下文中使用。存在信任链时,通常最受信任的实体会成为信任锚。
例如,证书颁发机构 (CA) 可以是信任锚。证书路径从主题证书开始,包含许多中间证书,结尾是一个受信任的根证书,通常由受信任的 CA 颁发。
缓解与预防
按照要求,必须通过构造证书路径来验证证书,这可确保将已接受的信任锚的证书路径用于证书验证,且证书路径包含状态信息。证书路径的状态信息包括证书吊销列表或在线证书状态协议响应。
漏洞代码示例
复制
import java.security.cert.*;
import java.io.*;
public class Test {
public static void generateClientCertificate(final byte[] certEncoded) throws CertificateException{
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate x509Cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(certEncoded));
}
}
Klocwork 在第 6 行报告了 SV.IL.SESSION.CLIENT 缺陷,指出“使用基于 PKI 的身份验证时,应用程序必须通过构造证书路径来验证证书。”
修正代码示例 1
复制
import java.security.cert.*;
public class Test {
public static void validatePath(List<X509Certificate> certs, Set<TrustAnchor> trustAnchors) throws GeneralSecurityException {
CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
PKIXParameters params = new PKIXParameters(trustAnchors);
params.setRevocationEnabled(false);
CertificateFactory cf = CertificateFactory.getInstance("X509");
CertPath path = cf.generateCertPath(certs);
PKIXCertPathValidatorResult pkixResult = (PKIXCertPathValidatorResult) cpv.validate(path, params);
TrustAnchor ta = pkixResult.getTrustAnchor();
X509Certificate cert = ta.getTrustedCert();
}
}
Klocwork 不再报告缺陷,因为使用信任锚生成经过验证的证书。