2017-01-27 16 views
0

我使用以下代碼片段從CSR文件中提取以上詳細信息。幾乎所有時間我都可以獲得COUNTRY,STATE,LOCALE,ORGANIZATION,ORGANIZATION_UNIT和COMMON_NAME的正確值,但不適用於EMAIL。如何從Java中的X500Name中提取C,ST,L,O,OU,CN,E?

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,O,OU,CN,E)一致。 欲瞭解更多信息,請參閱org.bouncycastle.asn1.x500.style.BCStyle;

相關問題