如何从其文件中获取证书类型?

时间:2017-09-14 11:02:09

标签: java ssl certificate x509certificate bouncycastle

我有X509Certificate,我想以编程方式确定其类型(扩展验证(EV SSL),组织验证(OV SSL)或域验证(DV SSL))。

我使用BouncyCastle cryptoAPI读取了我的证书。例如,这是我从文件中读取它并获取发行者和主题公用名(CN)的方式:

...
CertificateFactory cf = CertificateFactory.getInstance("X.509");
FileInputStream input = new FileInputStream(certfile);                                  
X509Certificate cert = (X509Certificate)cf.generateCertificate(input);
X500Name x500name = new JcaX509CertificateHolder(cert).getSubject();
X500Name issuer = new JcaX509CertificateHolder(cert).getIssuer();
...

我怎样才能在程序中获得给定证书的类型?

2 个答案:

答案 0 :(得分:0)

技术视图中的证书类型没有区别。这更像是一个组织协议。

您可以检查证书主题(您调用的变量x500name)。如果此字段包含密钥jurisdictionOfIncorporationCountryNamebusinessCategory的值,则您拥有EV证书。然后,密钥serialNumber指向此业务实体的某些合法注册密钥(如我们的德语 Handelsregisternummer ),密钥CN是此业务实体的注册名称。

据我所知,DV和OV之间的区别更像是一种营销功能。

答案 1 :(得分:0)

我正在使用 BouncyCastle 1.57 。如果您使用的是版本< 1.47,代码可能不同,因为在1.47中他们做了significant changes in the API(尽管这个想法是相同的)。

要检查证书是DV还是OV,您可以查看Certificate Policies extension,如this answerGlobalSign's website中所述:

Type                     Policy Identifier
Domain Validated         2.23.140.1.2.1
Organization Validated   2.23.140.1.2.2
     

拥有这些标识符使我们在确定性评估证书颁发政策的目标方面走了很长的路 - 也就是说,并非所有CA都已采用它们

请注意,此方法不是100%保证,因为并非所有证书颁发机构都完全采用此方法。话虽如此,您可以使用以下方法检查此扩展名与BouncyCastle:

import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.DLSequence;
import org.bouncycastle.x509.extension.X509ExtensionUtil;

X509Certificate cert = // get certificate

byte[] value = cert.getExtensionValue("2.5.29.32");
if (value != null) { // extension is present
    // CertificatePolicies is a sequence
    DLSequence seq = (DLSequence) X509ExtensionUtil.fromExtensionValue(value);
    for (int i = 0; i < seq.size(); i++) {
        // each element is also a sequence
        DLSequence s = (DLSequence) seq.getObjectAt(i);
        // first element is an OID
        String oid = ((ASN1ObjectIdentifier) s.getObjectAt(0)).getId();
        if ("2.23.140.1.2.1".equals(oid)) {
            // DV
        } else if ("2.23.140.1.2.2".equals(oid)) {
            // OV
        }
    }
}