Java 在证书主体和颁发者中反转的属性

Java 在证书主体和颁发者中反转的属性,java,x509certificate,bouncycastle,jks,Java,X509certificate,Bouncycastle,Jks,我正在尝试使用bouncycastle 1.46生成X509证书,代码如下。 我遇到的问题是,当在JKS中写入证书,然后重新读取时,DNs被反转。 例如,如果我运行下面的代码,我会得到以下输出: CN=test,O=gina CN=test,O=gina CN=test,O=gina O=gina, CN=test 有人知道原因吗?如何避免呢? 提前谢谢 代码: 我对bouncy 1.47也有同样的问题 首先,必须小心使用X500Name和X500Principal类。有太阳类和弹跳类。他们完

我正在尝试使用bouncycastle 1.46生成X509证书,代码如下。 我遇到的问题是,当在JKS中写入证书,然后重新读取时,DNs被反转。 例如,如果我运行下面的代码,我会得到以下输出:

CN=test,O=gina
CN=test,O=gina
CN=test,O=gina
O=gina, CN=test
有人知道原因吗?如何避免呢? 提前谢谢

代码:


我对bouncy 1.47也有同样的问题

首先,必须小心使用X500Name和X500Principal类。有太阳类和弹跳类。他们完全不同

应使用X500NameBuilder创建X500Name(bouncy)。 但是如果您需要使用字符串创建它,那么您的属性必须按照RFC2253的相反顺序,这意味着您的属性必须按照以下顺序:“CN、L、ST、O、OU、C、STREET、DC、UID”

这并不方便,因为在我的例子中,我必须从X500主体(SUN)创建一个X500名称(bouncy),唯一的方法是使用X500主体:getName()方法,该方法根据RFC2253顺序打印属性。所以我创建了这个方法:

private org.bouncycastle.asn1.x500.X500Name toBouncyX500Name( javax.security.auth.x500.X500Principal principal) {

    String name = principal.getName();

    String[] RDN = name.split(",");

    StringBuffer buf = new StringBuffer(name.length());
    for(int i = RDN.length - 1; i >= 0; i--){
        if(i != RDN.length - 1)
            buf.append(',');

        buf.append(RDN[i]);
    }

    return new X500Name(buf.toString());
}

希望它对某人有用:)

我遇到了同样的问题,并通过以下方法快速解决了它:

//CREATES AN X500 CA SUBJECT FOR ISSUER

X500Name issuerName = new JcaX509CertificateHolder((X509Certificate) caCert).getSubject();
//CONSTRUCTS THE X509 CERTIFIFATE OBJECT

X509v3CertificateBuilder v3CertGen = new X509v3CertificateBuilder(
issuerName, 
serialNumber, 
startDate, endDate, 
DevCsr.getSubject(), 
DevCsr.getSubjectPublicKeyInfo());
然后,我将其与以下内容一起使用:

//CREATES AN X500 CA SUBJECT FOR ISSUER

X500Name issuerName = new JcaX509CertificateHolder((X509Certificate) caCert).getSubject();
//CONSTRUCTS THE X509 CERTIFIFATE OBJECT

X509v3CertificateBuilder v3CertGen = new X509v3CertificateBuilder(
issuerName, 
serialNumber, 
startDate, endDate, 
DevCsr.getSubject(), 
DevCsr.getSubjectPublicKeyInfo());
Java密钥库终端实体证书中的颁发者名称现在以正确的顺序显示


干杯

这可能要简单一点。至少在BC 1.48+中,您可以这样构造X500名称,并且OID将按照预期的方式(或至少按照您指定的方式)排序:


我想这应该是答案。如果证书验证成功,订单对我来说不会有问题。我进行了数小时的SSL握手调试,直到我发现由于属性顺序颠倒而找不到证书。大掌心!