我正在尝试查找实现java.security.principal的类,以便为证书提供主题DN值。在搜索的过程中,我偶然发现X500Name是一个通常用于提供主题的类。但是,这并没有实现Principal接口。让我惊讶的是,与X500Name不同的是,X500Name的降价类X509Principal实现了这个接口。使用什么类?
谢谢
发布于 2014-04-29 20:05:05
我推荐使用实现java.security.Principal的bouncy castle类:org.bouncycastle.jce.X509Principal。为了获取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在上一个弹跳城堡版本中被弃用了。因此您可以使用org.bouncycastle.asn1.x500.X500Name来处理subjectDN字段,但是,如果您希望使用一个通过javax.security.auth.x500.X500Principal实现java.security.Principal类,我给您提供另一个示例:
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()));
}
}发布于 2014-04-30 16:05:39
错误,javax.security.auth.X500Principal
所有实现的接口:
Serializable, Principal https://stackoverflow.com/questions/23362698
复制相似问题