[英]How to get a certificate type from its file?
我有一個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();
...
如何在程序中獲取給定證書的類型?
證書類型在技術上沒有什么不同。 這更多是組織上的協議。
您可以檢查證書主題(稱為x500name
的變量)。 如果此字段包含鍵jurisdictionOfIncorporationCountryName
和businessCategory
值,則您具有EV證書。 密鑰serialNumber
然后指向該商業實體的一些合法注冊密鑰(例如我們的德語Handelsregisternummer ),而密鑰CN是該商業實體的注冊名稱。
據我所知,DV和OV之間的區別更多是一種營銷功能。
我正在使用BouncyCastle 1.57 。 如果您使用的版本小於1.47,則代碼可能會有所不同,因為在1.47中,它們對API進行了重大更改 (盡管想法是相同的)。
要檢查證書是DV還是OV,可以按照此答案和GlobalSign的網站中的說明檢查“ 證書策略”擴展名 :
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
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.