title: Attributes reversed in certificate subject and issuer
body: <p>I am trying to generate X509 certificates with bouncycastle 1.46, with the code below.
  The issue I have is that when a certificate is written in a JKS and then reread, the DNs are reversed.
  For instance, if I run the code below, I get the following output:</p>
  
  <pre><code>CN=test,O=gina
  CN=test,O=gina
  CN=test,O=gina
  O=gina, CN=test
  </code></pre>
  
  <p>Does anybody know the reason for this? how to avoid it?
  Thanks in advance.</p>
  
  <p>Code:</p>
  
  <pre><code>public static void main(String[] args) {
      try {
          Security.addProvider(new BouncyCastleProvider());
  
          KeyPair pair = generateKeyPair("RSA", 1024);
          X500Name principal = new X500Name("cn=test,o=gina");
          System.out.println(principal);
          BigInteger sn = BigInteger.valueOf(1234);
          Date start = today();
          Date end = addYears(start, 2);
          X509Certificate cert = generateCert(principal, pair, sn, start, end,
                  "SHA1withRSA");
          cert.verify(pair.getPublic());
          System.out.println(cert.getSubjectDN());
  
          // Store the certificate in the JKS
          KeyStore ks = KeyStore.getInstance("JKS");
          ks.load(null, null);
          ks.setKeyEntry("alias", pair.getPrivate(), KEY_PWD,
                  new X509Certificate[] {cert});
          X509Certificate c
                  = (X509Certificate)ks.getCertificateChain("alias")[0];
          System.out.println(c.getSubjectDN());
          OutputStream out = new FileOutputStream("text.jks");
          try {
              ks.store(out, KEYSTORE_PWD);
          } finally {
              out.close();
          }
  
          // Reread the JKS
          ks = KeyStore.getInstance("JKS");
          InputStream in = new FileInputStream("text.jks");
          try {
              ks.load(in, KEYSTORE_PWD);
          } finally {
              in.close();
          }
          c = (X509Certificate)ks.getCertificateChain("alias")[0];
          c.verify(pair.getPublic());
          System.out.println(c.getSubjectDN());
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  
  private static X509Certificate generateCert(X500Name principal,
          KeyPair pair, BigInteger sn, Date start, Date end, String sigalg)
          throws OperatorCreationException, CertificateException {
      JcaX509v3CertificateBuilder certGen
              = new JcaX509v3CertificateBuilder(principal, sn, start, end,
                      principal, pair.getPublic());
      JcaContentSignerBuilder builder
              = new JcaContentSignerBuilder(sigalg);
      builder.setProvider("BC");
      ContentSigner signr = builder.build(pair.getPrivate());
      X509CertificateHolder certHolder = certGen.build(signr);
      JcaX509CertificateConverter conv
              = new JcaX509CertificateConverter();
      conv.setProvider("BC");
      return conv.getCertificate(certHolder);
  }
  
  private static KeyPair generateKeyPair(String algorithm, int keySize)
          throws NoSuchAlgorithmException {
      KeyPairGenerator gen = KeyPairGenerator.getInstance(algorithm);
      gen.initialize(keySize);
      return gen.generateKeyPair();
  }
  
  private static Date today() {
      Calendar cal = Calendar.getInstance();
      cal.set(Calendar.HOUR_OF_DAY, 0);
      cal.set(Calendar.MINUTE, 0);
      cal.set(Calendar.SECOND, 0);
      cal.set(Calendar.MILLISECOND, 0);
      return cal.getTime();
  }
  
  private static Date addYears(Date date, int count) {
      Calendar cal = Calendar.getInstance();
      cal.setTime(date);
      cal.add(Calendar.YEAR, count);
      return cal.getTime();
  }
  </code></pre>