Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从文件中获取证书类型?_Java_Ssl_Certificate_X509certificate_Bouncycastle - Fatal编程技术网

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

Java 如何从文件中获取证书类型?,java,ssl,certificate,x509certificate,bouncycastle,Java,Ssl,Certificate,X509certificate,Bouncycastle,我有一个X509Certificate,我想通过编程确定它的类型(扩展验证(EV-SSL)、组织验证(OV-SSL)或域验证(DV-SSL)) 我使用BouncyCastle cryptoAPI阅读我的证书。例如,我就是这样从文件中读取的,并获得发行人和主题的通用名称(CN): 如何在我的程序中获取给定证书的类型?从技术角度看,证书类型没有什么不同。这更像是一个组织协议 您可以检查证书主题(您调用的变量x500name)。如果此字段包含密钥辖区FinCorporationCountryName和

我有一个
X509Certificate
,我想通过编程确定它的类型(扩展验证(EV-SSL)、组织验证(OV-SSL)或域验证(DV-SSL))

我使用BouncyCastle cryptoAPI阅读我的证书。例如,我就是这样从文件中读取的,并获得发行人和主题的通用名称(CN):


如何在我的程序中获取给定证书的类型?

从技术角度看,证书类型没有什么不同。这更像是一个组织协议

您可以检查证书主题(您调用的变量
x500name
)。如果此字段包含密钥
辖区FinCorporationCountryName
业务类别
的值,则您拥有EV证书。密钥
serialNumber
然后指向该企业实体的某个合法注册密钥(如我们的德国HandelRegisterNummer),密钥CN是该企业实体的注册名称


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

从技术角度看,证书类型没有什么不同。这更像是一个组织协议

您可以检查证书主题(您调用的变量
x500name
)。如果此字段包含密钥
辖区FinCorporationCountryName
业务类别
的值,则您拥有EV证书。密钥
serialNumber
然后指向该企业实体的某个合法注册密钥(如我们的德国HandelRegisterNummer),密钥CN是该企业实体的注册名称


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

我使用的是BouncyCastle 1.57。如果您使用的是<1.47的版本,代码可能会有所不同,因为在1.47中,他们制作了(尽管想法相同)

要检查证书是DV还是OV,可以检查,如和中所述:

有了这些标识符,我们就可以实现对证书颁发策略进行确定性评估的目标,也就是说,并非所有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
        }
    }
}
import org.bounchycastle.asn1.ASN1ObjectIdentifier;
导入org.bouncycastle.asn1.DLSequence;
导入org.bouncycastle.x509.extension.X509ExtensionUtil;
X509Certificate cert=//获取证书
字节[]值=cert.getExtensionValue(“2.5.29.32”);
如果(value!=null){//存在扩展名
//证书政策是一个序列
DLSequence seq=(DLSequence)X509ExtensionUtil.fromExtensionValue(值);
对于(int i=0;i
我使用的是BouncyCastle 1.57。如果您使用的是<1.47的版本,代码可能会有所不同,因为在1.47中,他们制作了(尽管想法相同)

要检查证书是DV还是OV,可以检查,如和中所述:

有了这些标识符,我们就可以实现对证书颁发策略进行确定性评估的目标,也就是说,并非所有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
        }
    }
}
import org.bounchycastle.asn1.ASN1ObjectIdentifier;
导入org.bouncycastle.asn1.DLSequence;
导入org.bouncycastle.x509.extension.X509ExtensionUtil;
X509Certificate cert=//获取证书
字节[]值=cert.getExtensionValue(“2.5.29.32”);
如果(value!=null){//存在扩展名
//证书政策是一个序列
DLSequence seq=(DLSequence)X509ExtensionUtil.fromExtensionValue(值);
对于(int i=0;i
我做了一些研究,发现可以从其
CertificatePolicyID
中获取证书类型,但我甚至不知道如何以编程方式访问证书对象的此属性。我做了一些研究,发现可以从其
CertificatePolicyID
获取证书类型,但我甚至不知道如何以编程方式访问证书对象的此属性。
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
        }
    }
}