如何从Java中的X500Name中提取C,ST,L,O,OU,CN,E?

时间:2017-01-27 12:30:36

标签: java csr

我使用以下代码段从CSR文件中提取上述详细信息。几乎所有的时间我都获得了COUNTRY,STATE,LOCALE,ORGANIZATION,ORGANIZATION_UNIT和COMMON_NAME的正确值,但不是EMAIL。

public class CSRInfoDecoder {

private static Logger LOG = Logger.getLogger(CSRInfoDecoder.class.getName());

private static final String COUNTRY = "2.5.4.6";
private static final String STATE = "2.5.4.8";
private static final String LOCALE = "2.5.4.7";
private static final String ORGANIZATION = "2.5.4.10";
private static final String ORGANIZATION_UNIT = "2.5.4.11";
private static final String COMMON_NAME = "2.5.4.3";
private static final String EMAIL = "2.5.4.9";

private static final String csrPEM = "-----BEGIN CERTIFICATE REQUEST-----\n"
        + "MIICxDCCAawCAQAwfzELMAkGA1UEBhMCVVMxETAPBgNVBAgMCElsbGlub2lzMRAw\n"
        + "DgYDVQQHDAdDaGljYWdvMQ4wDAYDVQQKDAVDb2RhbDELMAkGA1UECwwCTkExDjAM\n"
        + "BgNVBAMMBUNvZGFsMR4wHAYJKoZIhvcNAQkBFg9rYmF4aUBjb2RhbC5jb20wggEi\n"
        + "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSrEF27VvbGi5x7LnPk4hRigAW\n"
        + "1feGeKOmRpHd4j/kUcJZLh59NHJHg5FMF7u9YdZgnMdULawFVezJMLSJYJcCAdRR\n"
        + "hSN+skrQlB6f5wgdkbl6ZfNaMZn5NO1Ve76JppP4gl0rXHs2UkRJeb8lguOpJv9c\n"
        + "tw+Sn6B13j8jF/m/OhIYI8fWhpBYvDXukgADTloCjOIsAvRonkIpWS4d014deKEe\n"
        + "5rhYX67m3H7GtZ/KVtBKhg44ntvuT2fR/wB1FlDws+0gp4edlkDlDml1HXsf4FeC\n"
        + "ogijo6+C9ewC2anpqp9o0CSXM6BT2I0h41PcQPZ4EtAc4ctKSlzTwaH0H9MbAgMB\n"
        + "AAGgADANBgkqhkiG9w0BAQsFAAOCAQEAqfQbrxc6AtjymI3TjN2upSFJS57FqPSe\n"
        + "h1YqvtC8pThm7MeufQmK9Zd+Lk2qnW1RyBxpvWe647bv5HiQaOkGZH+oYNxs1XvM\n"
        + "y5huq+uFPT5StbxsAC9YPtvD28bTH7iXR1b/02AK2rEYT8a9/tCBCcTfaxMh5+fr\n"
        + "maJtj+YPHisjxKW55cqGbotI19cuwRogJBf+ZVE/4hJ5w/xzvfdKjNxTcNr1EyBE\n"
        + "8ueJil2Utd1EnVrWbmHQqnlAznLzC5CKCr1WfmnrDw0GjGg1U6YpjKBTc4MDBQ0T\n"
        + "56ZL2yaton18kgeoWQVgcbK4MXp1kySvdWq0Bc3pmeWSM9lr/ZNwNQ==\n"
        + "-----END CERTIFICATE REQUEST-----\n";

public static void main(String[] args) {
    InputStream stream = new ByteArrayInputStream(csrPEM.getBytes(StandardCharsets.UTF_8));

    CSRInfoDecoder m = new CSRInfoDecoder();
    m.readCertificateSigningRequest(stream);
}

public void readCertificateSigningRequest(InputStream csrStream) {

    PKCS10CertificationRequest csr = convertPemToPKCS10CertificationRequest(csrStream);
    String compname = null;

    if (csr == null) {
        LOG.warn("FAIL! conversion of Pem To PKCS10 Certification Request");
    } else {
        X500Name x500Name = csr.getSubject();

 System.out.println("x500Name is: " + x500Name + "\n");


        System.out.println("COUNTRY: " + getX500Field(COUNTRY, x500Name));

        System.out.println("STATE: " + getX500Field(STATE, x500Name));

        System.out.println("LOCALE: " + getX500Field(LOCALE, x500Name));

        System.out.println("ORGANIZATION: " + getX500Field(ORGANIZATION, x500Name));

        System.out.println("ORGANIZATION_UNIT: " + getX500Field(ORGANIZATION_UNIT, x500Name));

        System.out.println("COMMON_NAME: " + getX500Field(COMMON_NAME, x500Name));

        System.out.println("EMAIL: " + getX500Field(EMAIL, x500Name));
  }

}

除了使用ASN1ObjectIdentifiers之外,即

private static final String COUNTRY = "2.5.4.6";
private static final String STATE = "2.5.4.8";

还有其他方法可以达到这个目的吗?我需要一致地为每个字段(C,ST,L,O,OU,CN,E)获取值。

1 个答案:

答案 0 :(得分:0)

我可以使用以下代码段

来达到上述要求
RDN email = x500Name.getRDNs(BCStyle.EmailAddress)[0];
RDN cn = x500Name.getRDNs(BCStyle.CN)[0];
System.out.println(email.getFirst().getValue().toString());
System.out.println(cn.getFirst().getValue().toString());

通过这种方式,我能够始终获得(C,ST,L,O,OU,CN,E)的值。 有关详细信息,请参阅org.bouncycastle.asn1.x500.style.BCStyle;