2017-01-27 24 views
0

Я использую следующий фрагмент кода для извлечения более подробной информации из файла CSR. Почти все время я получаю правильные значения для СТРАНЫ, ГОСУДАРСТВА, ЛОКАЛИЗАЦИИ, ОРГАНИЗАЦИИ, ОРГАНИЗАЦИИ_UNIT и COMMON_NAME, но не для EMAIL.Как извлечь C, ST, L, O, OU, CN, E из X500Name в Java?

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).

ответ

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, О, НУ, CN, Е) последовательно. Для получения дополнительной информации см. org.bouncycastle.asn1.x500.style.BCStyle;