views:

520

answers:

3

Hi,

i'm looking for a java library or code to generate certificates, public and private keys on the fly without to use third party programs (such as openssl).

I think something that is doeing keytool+openssl but from Java code.

Consider a java servlet based web application secured with ssl and client authentification. I want the servlet container generate client certificates (eg. pkcs12 format) on request only with Java code.

Thank you, Peter.

+2  A: 

The Bouncy Castle crypto libraries are fairly comprehensive.

Thilo
Arghhh, i had this library in my hands before and i don't remember. Thank you !
PeterMmm
+1  A: 

Alternatively you could just invoke the SUN java keytool class and provide the needed parameters to generate the certificates. But these classes are in the com.sun* package and will potentially change. In theory everything is present in Java to generate your own certificates, but it is not publically available.

David Nouls
+1  A: 

You can generate Certificate in java dynamically, by using a pair or keys. (Public Key, Private Keys). Get These keys as BigInteger format and checking the following code to generate certificate.

RSAPrivateKeySpec serPrivateSpec = new RSAPrivateKeySpec(new BigInteger(val of pub key), new BigInteger(val of pri key)); fact = KeyFactory.getInstance("RSA"); PrivateKey serverPrivateKey = fact.generatePrivate(serPrivateSpec);

RSAPublicKeySpec serPublicSpec = new RSAPublicKeySpec(new BigInteger(agentCL.getSerPubMod()), new BigInteger(agentCL.getSerPubExp()));
PublicKey serverPublicKey = fact.generatePublic(serPublicSpec);

keyStore = KeyStore.getInstance(IMXAgentCL.STORE_TYPE);
keyStore.load(null, SOMEPWD.toCharArray());

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

X509Certificate[] serverChain = new X509Certificate[1];
X509V3CertificateGenerator serverCertGen = new X509V3CertificateGenerator();
X500Principal serverSubjectName = new X500Principal("CN=OrganizationName");
serverCertGen.setSerialNumber(new BigInteger("123456789"));
            // X509Certificate caCert=null;
serverCertGen.setIssuerDN(somename);
serverCertGen.setNotBefore(new Date());
serverCertGen.setNotAfter(new Date());
serverCertGen.setSubjectDN(somename);
serverCertGen.setPublicKey(serverPublicKey);
serverCertGen.setSignatureAlgorithm("MD5WithRSA");
// certGen.addExtension(X509Extensions.AuthorityKeyIdentifier, false,new
// AuthorityKeyIdentifierStructure(caCert));
serverCertGen.addExtension(X509Extensions.SubjectKeyIdentifier, false,
  new SubjectKeyIdentifierStructure(serverPublicKey));
serverChain[0] = serverCertGen.generateX509Certificate(serverPrivateKey, "BC"); // note: private key of CA

keyStore.setEntry("xyz",
  new KeyStore.PrivateKeyEntry(serverPrivateKey, serverChain),
  new KeyStore.PasswordProtection("".toCharArray()));

Hope this will help you.

Sekhar