2013-10-16 25 views
6

Đây là những gì tôi có ngay bây giờ để tạo chứng chỉ số. Và bây giờ tôi có thể tạo một chứng chỉ số với mật khẩu được bảo vệ cho khóa riêng.Tạo chứng chỉ X509 với BouncyCastle bằng Java

public static void main(String[] args) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 
    testKeyStore(); 
} 

public static void testKeyStore() throws Exception { 
    try { 
     String storeName = "d://suresh_test.cer"; 
     java.security.KeyPairGenerator keyPairGenerator = KeyPairGenerator 
       .getInstance("RSA"); 
     keyPairGenerator.initialize(2048); 
     KeyPair keyPair = keyPairGenerator.generateKeyPair(); 
     PublicKey publicKey = keyPair.getPublic(); 
     PrivateKey privateKey = keyPair.getPrivate(); 
     X509Certificate trustCert = createCertificate("CN=CA", "CN=CA", 
       publicKey, privateKey); 
     java.security.cert.Certificate[] outChain = { 
       createCertificate("CN=Client", "CN=CA", publicKey, 
         privateKey), trustCert }; 
     KeyStore outStore = KeyStore.getInstance("PKCS12"); 
     outStore.load(null, "suresh_".toCharArray()); 
     outStore.setKeyEntry("mykey", privateKey, "suresh_".toCharArray(), 
       outChain); 
     OutputStream outputStream = new FileOutputStream(storeName); 
     outStore.store(outputStream, "suresh_".toCharArray()); 
     outputStream.flush(); 
     outputStream.close(); 

     KeyStore inStore = KeyStore.getInstance("PKCS12"); 
     inStore.load(new FileInputStream(storeName), 
       "suresh_".toCharArray()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new AssertionError(e.getMessage()); 
    } 
} 

private static X509Certificate createCertificate(String dn, String issuer, 
     PublicKey publicKey, PrivateKey privateKey) throws Exception { 
    X509V3CertificateGenerator certGenerator = new X509V3CertificateGenerator(); 
    certGenerator.setSerialNumber(BigInteger.valueOf(Math.abs(new Random() 
      .nextLong()))); 
    certGenerator.setIssuerDN(new X509Name(dn)); 
    certGenerator.setSubjectDN(new X509Name(dn)); 
    certGenerator.setIssuerDN(new X509Name(issuer)); // Set issuer! 
    certGenerator.setNotBefore(Calendar.getInstance().getTime()); 
    certGenerator.setNotAfter(Calendar.getInstance().getTime()); 
    certGenerator.setPublicKey(publicKey); 
    certGenerator.setSignatureAlgorithm("SHA1WithRSAEncryption"); 
    X509Certificate certificate = (X509Certificate) certGenerator.generate(
      privateKey, "BC"); 
    return certificate; 
} 

Làm cách nào để tự ký?

Tôi không có manh mối.

Tôi làm cách nào để tiếp tục?

Cảm ơn mọi gợi ý.

+1

Câu hỏi của bạn không giải thích những gì bạn đã làm để thử và giải quyết vấn đề; nó hiện đang đọc như một yêu cầu cho mã. Vui lòng chia sẻ việc triển khai đã thực hiện của bạn và giải thích cách nó không đáp ứng được các yêu cầu của bạn. –

+0

@DuncanJones Vâng, tôi đã tạo chứng chỉ. Nhưng không biết làm thế nào để ký nó bằng cách sử dụng API lâu đài bouncy, không tìm thấy bất kỳ điều gì trong trang web của họ. Cảm ơn đã giúp đỡ. –

Trả lời

4

Bạn có tất cả mã bạn cần để tạo chứng chỉ tự ký. Bạn chỉ cần đảm bảo chuỗi của bạn chỉ chứa một chứng chỉ.

public static void testKeyStore() throws Exception { 
    try { 
    String storeName = "path/to/store"; 
    java.security.KeyPairGenerator keyPairGenerator = KeyPairGenerator 
     .getInstance("RSA"); 
    keyPairGenerator.initialize(2048); 
    KeyPair keyPair = keyPairGenerator.generateKeyPair(); 
    PublicKey publicKey = keyPair.getPublic(); 
    PrivateKey privateKey = keyPair.getPrivate(); 
    X509Certificate selfCert = createCertificate("CN=Client", "CN=Client", 
     publicKey, privateKey); 

    // Note: if you just want to store this certificate then write the 
    // contents of selfCert.getEncoded() to file 

    java.security.cert.Certificate[] outChain = { selfCert }; 
    KeyStore outStore = KeyStore.getInstance("PKCS12"); 
    outStore.load(null, PASSWORD.toCharArray()); 
    outStore.setKeyEntry("mykey", privateKey, PASSWORD.toCharArray(), 
     outChain); 
    OutputStream outputStream = new FileOutputStream(storeName); 
    outStore.store(outputStream, PASSWORD.toCharArray()); 
    outputStream.flush(); 
    outputStream.close(); 

    KeyStore inStore = KeyStore.getInstance("PKCS12"); 
    inStore.load(new FileInputStream(storeName), PASSWORD.toCharArray()); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    throw new AssertionError(e.getMessage()); 
    } 
} 

Tôi khuyên bạn không nên ném AssertionError. Điều này chỉ nên được sử dụng bởi Java chính nó để chỉ ra một tuyên bố assert là sai.

+1

Thankyou Jones, một chút nghi ngờ. 'outStore.load (null, PASSWORD.toCharArray());' và 'outStore.setKeyEntry (" mykey ", privateKey, PASSWORD.toCharArray(), outChain);' tại sao cả hai mật khẩu chúng ta sử dụng? có cần thiết cho tệp kho khóa không? Cả hai mật khẩu có khác nhau không? –

+0

@ sᴜʀᴇsʜᴀᴛᴛᴀ Chủ yếu, những dòng này nằm trong ví dụ mã của tôi vì chúng nằm trong mã ban đầu của bạn. Kiểm tra tài liệu cho 'KeyStore' để hiểu ý nghĩa của chúng. –

+0

Vâng, tôi cũng làm như vậy. :) Cảm ơn đã giúp đỡ. Nếu bạn có thời gian, hãy nhìn vào điều này. http://stackoverflow.com/questions/19421571/providing-key-usage-to-x509certificate-generated-with-with-java-bouncycastle –

2

Sau khi trải qua cuối tuần để chuyển tiếp phiên bản BC của chúng tôi từ 143 đến 154, tôi đăng các bài học đã học, hy vọng nó sẽ tiết kiệm thời gian cho một người nào đó trong tương lai.

1) API eItention PKI từ BC đã được chuyển sang bình riêng. Tôi đã phá vỡ đầu của tôi để tìm PemParser trong bcprov-jdk15on-154.jar. Việc thực hiện cho PemParser là trong bcpkix-jdk15on-154.jar. Không cần phải nói lọ pkix phụ thuộc vào lõi bc jar.

2) Lớp PEMReader không có sẵn trong phiên bản 154 mới nhất. Điều này đã được thay thế bởi PemParser.

3) Đọc một giấy chứng nhận nào từ tập tin trên đĩa:

Security.addProvider(new BouncyCastleProvider()); 
File file = new File("c:/mycert.crt"); 
X509Certificate cert = null; 
PEMParser pemParser = new PEMParser(new FileReader(file)); 
Object object = pemParser.readObject(); 
if (object instanceof X509CertificateHolder) { 
    X509CertificateHolder holder = (X509CertificateHolder)object; 
    cert = new JcaX509CertificateConverter().setProvider("BC").getCertificate(holder); 
} 
if (cert == null) { 
    throw new Exception("mycert.crt" + " doesn't contain X509Certificate!"); 
} 
return cert; 
//If you need publicKey use cert.getPublicKey() method. 

4) Đọc một mật khẩu bảo vệ khóa riêng từ đĩa:

Security.addProvider(new BouncyCastleProvider()); 
KeyPair keyPair = null; 
File file = new File("c:/myprivate.key"); 
PEMParser pemParser = new PEMParser(new FileReader(file)); 
Object object = pemParser.readObject(); 
if (object instanceof PEMEncryptedKeyPair) { 
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); 
    PEMEncryptedKeyPair ckp = (PEMEncryptedKeyPair) object; 
    PEMDecryptorProvider decProv = 
      new JcePEMDecryptorProviderBuilder().build("strongpasswordfor_myprivate.key".toCharArray()); 
    keyPair = converter.getKeyPair(ckp.decryptKeyPair(decProv)); 
} 
return keyPair; 
//Once we have the keypair, we can get keyPair.getPrivate() [PrivateKey.class] 
//or keyPair.getPublic() [PublicKey.class] 

5) Đọc một giấy chứng nhận dựa trên chuỗi, đây là điển hình là trường hợp chúng tôi muốn thực hiện xác thực lẫn nhau SSL và có máy chủ web chuyển tiếp chứng chỉ ứng dụng khách đến máy chủ ứng dụng trong Tiêu đề yêu cầu Http:

Security.addProvider(new BouncyCastleProvider()); 
X509Certificate cert = null; 
    String myClientCert = "-----BEGIN CERTIFICATE----- CERTCONTENTS -----END CERTIFICATE-----" 
    String cert1 = myClientCert.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", "").replaceAll(" ", System.lineSeparator()); 
    int ind = cert1.lastIndexOf(System.lineSeparator()); 
    cert1 = new StringBuilder(cert1).replace(ind, ind + System.lineSeparator().length(), "").toString(); 
    cert1 = BEGIN_CERT + cert1 + END_CERT; 
    PEMParser pemParser = new PEMParser(new StringReader(cert1)); 
    Object object = pemParser.readObject(); 
    if (object instanceof X509CertificateHolder) { 
     X509CertificateHolder holder = (X509CertificateHolder)object; 
     cert = new JcaX509CertificateConverter().setProvider("BC").getCertificate(holder); 
    } 
    return cert; 

6) Không cần phải nói, thêm xử lý lỗi, quản lý ngoại lệ & dọn dẹp theo sở thích của bạn.

Các vấn đề liên quan