Skip to content

Instantly share code, notes, and snippets.

@alessandroleite
Last active March 2, 2024 00:41
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save alessandroleite/fa3e763552bb8b409bfa to your computer and use it in GitHub Desktop.
Save alessandroleite/fa3e763552bb8b409bfa to your computer and use it in GitHub Desktop.
Generate a self signed X509 certificate with Bouncy Castle
//Generate a self signed X509 certificate with Bouncy Castle.
// StringBuilder sb = new StringBuilder();
//
// for (int i = 0; i < pub.length; ++i)
// {
// sb.append(Integer.toHexString(0x0100 + (pub[i] & 0x00FF)).substring(1));
// }
//
// System.out.println(sb);
// sb.setLength(0);
//
// for (int i = 0; i < pri.length; ++i)
// {
// sb.append(Integer.toHexString(0x0100 + (pri[i] & 0x00FF)).substring(1));
// }
//
// byte[] enc = new PKCS8Generator(privateKey).generate().getContent();
//
// System.out.println(new String(Base64.encodeBase64(enc)));
//
//// new JcaPKCS8Generator(privateKey, new Output)
//
// Cipher cipher = SecurityUtils.getCipher("RSA");
// cipher.init(Cipher.DECRYPT_MODE, privateKey);
// byte[] doFinal = cipher.doFinal(pub);
// System.out.println(new String(doFinal));
//
// System.out.println(sb);
/**
* Generate a self signed X509 certificate with Bouncy Castle.
*/
static void generateSelfSignedX509Certificate() throws Exception {
// yesterday
Date validityBeginDate = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000);
// in 2 years
Date validityEndDate = new Date(System.currentTimeMillis() + 2 * 365 * 24 * 60 * 60 * 1000);
// GENERATE THE PUBLIC/PRIVATE RSA KEY PAIR
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
keyPairGenerator.initialize(1024, new SecureRandom());
java.security.KeyPair keyPair = keyPairGenerator.generateKeyPair();
// GENERATE THE X509 CERTIFICATE
X509V1CertificateGenerator certGen = new X509V1CertificateGenerator();
X500Principal dnName = new X500Principal("CN=John Doe");
certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
certGen.setSubjectDN(dnName);
certGen.setIssuerDN(dnName); // use the same
certGen.setNotBefore(validityBeginDate);
certGen.setNotAfter(validityEndDate);
certGen.setPublicKey(keyPair.getPublic());
certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
X509Certificate cert = certGen.generate(keyPair.getPrivate(), "BC");
// DUMP CERTIFICATE AND KEY PAIR
System.out.println(Strings.repeat("=", 80));
System.out.println("CERTIFICATE TO_STRING");
System.out.println(Strings.repeat("=", 80));
System.out.println();
System.out.println(cert);
System.out.println();
System.out.println(Strings.repeat("=", 80));
System.out.println("CERTIFICATE PEM (to store in a cert-johndoe.pem file)");
System.out.println(Strings.repeat("=", 80));
System.out.println();
PEMWriter pemWriter = new PEMWriter(new PrintWriter(System.out));
pemWriter.writeObject(cert);
pemWriter.flush();
System.out.println();
System.out.println(Strings.repeat("=", 80));
System.out.println("PRIVATE KEY PEM (to store in a priv-johndoe.pem file)");
System.out.println(Strings.repeat("=", 80));
System.out.println();
pemWriter.writeObject(keyPair.getPrivate());
pemWriter.flush();
System.out.println();
}
@grossjonas
Copy link

X509V1CertificateGenerator is now deprecated /-:

@ksprugevics
Copy link

X509V1CertificateGenerator is now deprecated /-:

You should now use org.bouncycastle.cert.X509v3CertificateBuilder;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment