2014-02-20 5 views
2

Я генерирую CSR (запрос подписи сертификата), используя код без проблем с соответствующей информацией. Мне нужны указатели, чтобы выяснить, как читать контент CSR с помощью Java и/или BouncyCastle.Декодирование/Чтение CSR (запрос подписи сертификата) Использование Java или BouncyCastle

Любые указатели или идеи оцениваются.

+0

Может быть полезно: http://stackoverflow.com/questions/7230330/sign-csr-using-bouncy-castle –

ответ

2

Фигурные это:

  1. Преобразование CSR PEM в PKCS10CertificationRequest
  2. Получить экземпляр X500Name путем доступа к методу getSubject() из экземпляра PKCS10CertificationRequest
  3. Iterate над [] массив RDN и получить специфическое поле вы хотите использовать один из ASN1ObjectIdentifier (например СТРАНА является 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', поэтому такие вещи, как' COUNTRY', не нужно воссоздавать с нуля. Однако это не «перечислить». – EpicPandaForce

Смежные вопросы