6

के साथ बाउंसीकास्टल के साथ X509 प्रमाणपत्र प्रस्तुत करना यह डिजिटल प्रमाणपत्र उत्पन्न करने के लिए अभी मेरे पास है। और अब मैं निजी कुंजी के लिए पासवर्ड के साथ एक डिजिटल प्रमाणपत्र उत्पन्न करने में सक्षम हूं।जावा

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; 
} 

इसे स्वयं साइन कैसे करें?

मेरे पास कोई सुराग नहीं है।

मैं इसके लिए कैसे आगे बढ़ सकता हूं?

किसी भी संकेत के लिए धन्यवाद।

+1

आपका प्रश्न यह नहीं बताता कि आपने समस्या को हल करने और हल करने के लिए क्या किया है; यह वर्तमान में कोड के लिए अनुरोध की तरह पढ़ता है। कृपया अपने प्रयास किए गए कार्यान्वयन को साझा करें और समझाएं कि यह आपकी आवश्यकताओं को पूरा करने में विफल रहता है। –

+0

@ डंकन जोन्स वेल, मैंने प्रमाण पत्र जेनरेट किया। लेकिन बाउंसी महल एपीआई का उपयोग करके इसे कैसे हस्ताक्षर नहीं करना है, उन्हें अपनी वेबसाइट में कोई चीज़ नहीं मिली है। सहायता के लिए धन्यवाद। –

उत्तर

4

आपके पास एक स्व-हस्ताक्षरित प्रमाणपत्र बनाने के लिए आवश्यक सभी कोड थे। आपको बस यह सुनिश्चित करने की आवश्यकता है कि आपकी श्रृंखला में केवल एक प्रमाणपत्र शामिल है।

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()); 
    } 
} 

मैं सलाह देता हूं कि आप AssertionError फेंक न दें। assert कथन को इंगित करने के लिए इसका उपयोग केवल जावा द्वारा ही किया जाना चाहिए।

+1

धन्यवाद, जोन्स, एक छोटा सा संदेह। 'outStore.load (शून्य, PASSWORD.toCharArray());' और 'outStore.setKeyEntry (" mykey ", privKey, PASSWORD.toCharArray(), आउट चेन); 'हम दोनों पासवर्ड क्यों इस्तेमाल करते थे? क्या यह keystore फ़ाइल के लिए आवश्यक है? क्या दोनों पासवर्ड अलग-अलग हो सकते हैं? –

+0

@ sᴜʀᴇsʜᴀᴛᴛᴀ मुख्य रूप से, वे पंक्तियां मेरे कोड उदाहरण में हैं क्योंकि वे आपके मूल कोड में थे। उनके अर्थ को समझने के लिए 'KeyStore' के लिए दस्तावेज़ देखें। –

+0

हां, मैं वही कर रहा हूं। :) सहायता के लिए धन्यवाद। यदि आपको समय मिलता है तो कृपया इसमें देखें। http://stackoverflow.com/questions/19421571/providing-key-usage-to-x509certificate-generated-with-with-java-bouncycastle –

2

हमारे बीसी संस्करण को 143 से 154 तक बंद करने के लिए सप्ताहांत खर्च करने के बाद, मैं उम्मीदों को पढ़ रहा हूं, उम्मीद है कि यह भविष्य में किसी के लिए कुछ समय बचाएगा।

1) बीसी से पीकेआई एक्स्टेंशन एपीआई को अपने जार में ले जाया गया है। मैं bcprov-jdk15on-154.jar में पेम्परसर खोजने के लिए अपना सिर तोड़ रहा था। पेम्परसर के लिए कार्यान्वयन bcpkix-jdk15on-154.jar में है। कहने की जरूरत नहीं है कि पिक्क्स जार कोर बीसी जार पर निर्भर करता है।

2) पीईएमआरडर वर्ग नवीनतम 154 संस्करण में उपलब्ध नहीं है। इसे पेम्परसर द्वारा प्रतिस्थापित किया गया है।

3) डिस्क पर फ़ाइल से एक सार्वजनिक प्रमाण पत्र पढ़ना:

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) एक पासवर्ड पढ़ना डिस्क से निजी कुंजी संरक्षित:

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) एक स्ट्रिंग आधारित प्रमाण पत्र पढ़ना, यह है आम तौर पर जब हम एसएसएल आपसी लेख करना चाहते हैं, और वेब सर्वर को क्लाइंट सर्टिफिकेट को एचटीपी अनुरोध शीर्षलेख में एप्लिकेशन सर्वर पर अग्रेषित करना है:

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) कहने की जरूरत नहीं है, त्रुटि प्रबंधन, अपवाद प्रबंधन & अपने स्वाद के लिए सफाई जोड़ें।