如何从文件中获取证书类型?
我有一个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();
...
我怎么能得到一个给定证书的我在程序的类型?
我正在使用BouncyCastle 1.57。如果您使用的版本是< 1.47,则代码可能会有所不同,因为在1.47版本中,代码可能是significant changes in the API(虽然这个想法是相同的)。
要检查是否该证书是DV或OV,您可以检查Certificate Policies extension,如this answer和GlobalSign'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
}
}
}
证书类型在技术视图中没有区别。这更多是一个组织协议。
您可以检查证书主题(您称为x500name
的变量)。如果此字段包含键值为jurisdictionOfIncorporationCountryName
和businessCategory
的值,则表示您有EV证书。然后,密钥serialNumber
指向该商业实体的一些合法注册密钥(如我们的德国Handelsregisternummer),关键CN是该商业实体的注册名称。
据我所知,DV和OV的区别更多的是营销功能。
我做了一些期试验研究,我发现,证书类型可以从它的'CertificatePolicyID'得到,但我不知道如何以编程方式访问证书对象的此属性。 –