X500名称到java.security.Principal

X500名称到java.security.Principal,java,bouncycastle,Java,Bouncycastle,我试图寻找实现java.security.principal的类,以便为证书提供主题DN值。在搜索时,我发现X500Name是通常用于提供主题的类。但是,这并没有实现主体接口。令我惊讶的是,X500Name的折旧类X509Principal实现了与X500Name不同的接口。使用什么类 谢谢我建议使用bouncy castle类:org.bouncycastle.jce.X509Principal,它实现了java.security.Principal。要获取org.bouncycastle.j

我试图寻找实现java.security.principal的类,以便为证书提供主题DN值。在搜索时,我发现X500Name是通常用于提供主题的类。但是,这并没有实现主体接口。令我惊讶的是,X500Name的折旧类X509Principal实现了与X500Name不同的接口。使用什么类


谢谢

我建议使用bouncy castle类:
org.bouncycastle.jce.X509Principal
,它实现了
java.security.Principal
。要获取
org.bouncycastle.jce.X509Principal
实例,可以使用以下方法:

public static org.bouncycastle.jce.X509Principal getSubjectX509Principal(
    java.security.cert.X509Certificate cert) throws CertificateEncodingException
org.bouncycastle.jce.PrincipalUtil

我给你一个样本:

import java.io.FileInputStream;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

public class X509PrincipalSample {

    public static void main(String[] args) throws Exception {

            CertificateFactory cf = CertificateFactory.getInstance("X509");
            // certificate file must be encoded in DER binary format
            FileInputStream certificateFile = new FileInputStream("/tmp/cer.cer");
            X509Certificate certificate = (X509Certificate) cf.generateCertificate(certificateFile);
            X509Principal x509Principal = PrincipalUtil.getSubjectX509Principal(certificate);
            System.out.println(x509Principal.getName());
    }
}
希望这有帮助

编辑:

正如您所说,
org.bouncycastle.jce.X509Principal
在上一个bouncycastle版本中被弃用。因此,您可以使用
org.bouncycastle.asn1.x500.X500Name
来处理subjectDN字段,但是,如果您想使用实现
java.security.Principal
的类,请使用
javax.security.auth.x500.X500Principal
,我再举一个例子:

import java.io.FileInputStream;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

import javax.security.auth.x500.X500Principal;

import org.bouncycastle.asn1.x500.RDN;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x500.style.BCStyle;
import org.bouncycastle.asn1.x500.style.IETFUtils;


public class X500NameSample {

    public static void main(String[] args) throws Exception {

         CertificateFactory cf = CertificateFactory.getInstance("X509");
         // certificate file must be encoded in DER binary format
         FileInputStream certificateFile = new FileInputStream("C:/Documents and Settings/aciffone/Escritorio/cer.cer");
         X509Certificate certificate = (X509Certificate) cf.generateCertificate(certificateFile);

         // using X500Principal
         X500Principal subjectX500Principal = certificate.getSubjectX500Principal();
         System.out.println(subjectX500Principal.getName());
         System.out.println(subjectX500Principal.getName(X500Principal.RFC1779));
         System.out.println(subjectX500Principal.getName(X500Principal.CANONICAL));

         // using X500Name
         X500Name x500name = new X500Name( subjectX500Principal.getName(X500Principal.RFC1779) );
         // you can get the different subject DN values with BCStyle constants
         RDN cn = x500name.getRDNs(BCStyle.CN)[0];
         System.out.println(IETFUtils.valueToString(cn.getFirst().getValue()));

         x500name = new X500Name( subjectX500Principal.getName() );
         // you can get the different subject DN values with BCStyle constants
         cn = x500name.getRDNs(BCStyle.CN)[0];
         System.out.println(IETFUtils.valueToString(cn.getFirst().getValue()));
    }
}

所有实现的接口:


嗯,谢谢你。但关键是BouncyCastle中的X509类本金被贬值了。文档中说:“已弃用。请使用X500Name类。”。。这正是我的问题你在上一个bc发行版中是对的X509Principal已被弃用,很抱歉我使用旧版本制作了示例。Hi@user907810我使用另一个类编辑答案,如果需要,请检查它。希望这有帮助。
    Serializable, Principal