2014-02-20 111 views
2

我正在使用代码生成一个CSR(证书签名请求),但没有相应信息的问题。我需要指出如何使用Java和/或BouncyCastle来阅读CSR内容。使用Java或BouncyCastle解码/读取CSR(证书签名请求)

任何指针或想法表示赞赏。

+0

可能是有用的:http://stackoverflow.com/questions/7230330/sign-csr-using-bouncy-castle –

回答

2

想通了:

  1. 转换的CSR PEM到PKCS10CertificationRequest
  2. 通过从PKCS10CertificationRequest实例访问getSubject()方法
  3. 迭代的RDN []阵列上获取X500Name实例和获得您希望使用ASN1ObjectIdentifier之一的特定字段(例如COUNTRY为2.5.4.6)

这里是代码:

public class EncryptDecrypt { 
    private Logger LOG = LoggerFactory.getLogger(EncryptDecrypt.class); 
    private final String COUNTRY = "2.5.4.6"; 
    private final String STATE = "2.5.4.8"; 
    private final String LOCALE = "2.5.4.7"; 
    private final String ORGANIZATION = "2.5.4.10"; 
    private final String ORGANIZATION_UNIT = "2.5.4.11"; 
    private final String COMMON_NAME = "2.5.4.3"; 


    @Test 
    public void testReadCertificateSigningRequest() { 
     String csrPEM = "-----BEGIN CERTIFICATE REQUEST-----\n" + 
       "MIICwjCCAaoCAQAwfTELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0Zsb3JpZGExEzAR\n" + 
       "BgNVBAcTCkJvY2EgUmF0b24xGzAZBgNVBAoTEkxvb25leSBUb29ucywgSW5jLjEU\n" + 
       "MBIGA1UECxMLRGV2ZWxvcG1lbnQxFDASBgNVBAMTC2V4YW1wbGUuY29tMIIBIjAN\n" + 
       "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiJCj31d1Rp+aKz/GTkedaiS/VSCc\n" + 
       "PRARYgXukobjgBHx46HjldAcfg/DoANn5lEQaFxaIZJLbZ/AdLUyw/hUbU0CjWXv\n" + 
       "pN3Ep3o9XgRTPkIFoI22VOI/O2ZLjBq/E4DWyVmv+vG6BK0LRh7hykzPCw6KIRR9\n" + 
       "NCmUMJMQX5d5P/r1lR5H399pnLcLsrHoWDwBSEDgkGWyxnvEB0+/bIz42T3qnlFt\n" + 
       "7avarxlHG2p5DoRTf8GJ+6imY88ZeBW/Nk18aDINsAHWLv383JICIAsZ3VuMk8m/\n" + 
       "Z/Z5b21zIuZECDJjZjvAAjr/shVLB+Pck5+HJy6tqj79MJOQu+jKIrK8VwIDAQAB\n" + 
       "oAAwDQYJKoZIhvcNAQEFBQADggEBAGtuAAHG4OC9jSRjGWSqfMXTDMz9tgekDREA\n" + 
       "SYv5QIrOXsMzwbgDw8LxRJZEskl4JJOnjwEvUXWUF1M6XmG2h358nOnrkOlsumHw\n" + 
       "Tx5gGSr6S6aJO/HG46erctE8aWpnFZYMfuEkul4ApsIufL7Bxqs3NHZWcrWBlLIP\n" + 
       "aVCKx1FPRMC36Tj3EslbuUB/iTRt90Nfq1IxHMIKiwCiSNJSqfRVLANhI8MUbOjB\n" + 
       "CBly1wcH68WWNkyvHVvbcF/B9AfYG9AqWjZjygKpyf81VZWctXhDc8UtomqrblXN\n" + 
       "mvz4RKpIhZQLuuxlBrdzJkPm2sOdtdZghebCRRVWdjsig4sylgQ=\n" + 
       "-----END CERTIFICATE REQUEST-----"; 

     PKCS10CertificationRequest csr = convertPemToPKCS10CertificationRequest(csrPEM); 

     X500Name x500Name = csr.getSubject(); 
     System.out.println("x500Name is: " + x500Name + "\n"); 

     // country is 2.5.4.6 
     System.out.println("COUNTRY: " + getX500Field(COUNTRY, x500Name)); 
     // state is 2.5.4.8 
     System.out.println("STATE: " + getX500Field(STATE, x500Name)); 
     // locale is 2.5.4.7 
     System.out.println("LOCALE: " + getX500Field(LOCALE, x500Name)); 


    } 

    private String getX500Field(String asn1ObjectIdentifier, X500Name x500Name) { 
     RDN[] rdnArray = x500Name.getRDNs(new ASN1ObjectIdentifier(asn1ObjectIdentifier)); 
     String retVal = null; 
     for (RDN item : rdnArray) { 
      retVal = item.getFirst().getValue().toString(); 
     } 

     return retVal; 
    } 

    private PKCS10CertificationRequest convertPemToPKCS10CertificationRequest(String pem) { 
     Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
     PKCS10CertificationRequest csr = null; 
     ByteArrayInputStream pemStream = null; 
     try { 
      pemStream = new ByteArrayInputStream(pem.getBytes("UTF-8")); 
     } catch (UnsupportedEncodingException ex) { 
      LOG.error("UnsupportedEncodingException, convertPemToPublicKey", ex); 
     } 

     Reader pemReader = new BufferedReader(new InputStreamReader(pemStream)); 
     PEMParser pemParser = new PEMParser(pemReader); 

     try { 
      Object parsedObj = pemParser.readObject(); 

      System.out.println("PemParser returned: " + parsedObj); 

      if (parsedObj instanceof PKCS10CertificationRequest) { 
       csr = (PKCS10CertificationRequest) parsedObj; 

      } 
     } catch (IOException ex) { 
      LOG.error("IOException, convertPemToPublicKey", ex); 
     } 

     return csr; 
    } 

    private String toPEM(Object key) { 
     StringWriter sw = new StringWriter(); 
     PEMWriter pem = new PEMWriter(sw); 
     try { 
      pem.writeObject(key); 
      pem.close(); 
     } catch (IOException e) { 
      System.out.printf("IOException: %s%n", e); 
     } 
     return sw.toString(); 
    } 
} 
+0

值得注意的是'ASN1ObjectIdentifier's存储在'BCStyle'静态类如'public static final ASN1ObjectIdentifier's,所以像'COUNTRY'这样的东西不需要从零重新创建。但是,它不是'enum'。 – EpicPandaForce

相关问题