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 不再报告缺陷,因为使用信任锚生成经过验证的证书。