Self signed X509 Certificate with Bouncy Castle in Java

后端 未结 4 650
旧时难觅i
旧时难觅i 2020-11-27 18:43

I need to create a self signed X509 Certificate with Bouncy Castle in Java, but every class I try to include is deprecated. How can I solve this? Is there some other class

4条回答
  •  鱼传尺愫
    2020-11-27 19:21

    BEWARE: This answer uses an old version of the library with 11 CVEs.

    Here's what i'm using (with BouncyCastle v1.38):

    import java.math.BigInteger;
    import java.security.InvalidKeyException;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.SecureRandom;
    import java.security.Security;
    import java.security.SignatureException;
    import java.util.Date;
    
    import javax.security.auth.x500.X500Principal;
    
    import java.security.cert.CertificateEncodingException;
    import java.security.cert.X509Certificate;
    
    import org.bouncycastle.asn1.x509.ExtendedKeyUsage;
    import org.bouncycastle.asn1.x509.KeyPurposeId;
    import org.bouncycastle.asn1.x509.X509Extensions;
    import org.bouncycastle.asn1.x509.X509Name;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.bouncycastle.x509.X509V3CertificateGenerator;
    
    public class BouncyCastle {
    
        public static void main(String[] args) throws CertificateEncodingException, InvalidKeyException, IllegalStateException, NoSuchProviderException, NoSuchAlgorithmException, SignatureException {
            X509Certificate selfSignedX509Certificate = new BouncyCastle().generateSelfSignedX509Certificate();
            System.out.println(selfSignedX509Certificate);
        }
    
        public X509Certificate generateSelfSignedX509Certificate() throws CertificateEncodingException, InvalidKeyException, IllegalStateException,
                NoSuchProviderException, NoSuchAlgorithmException, SignatureException {
            addBouncyCastleAsSecurityProvider();
    
            // generate a key pair
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
            keyPairGenerator.initialize(4096, new SecureRandom());
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
            // build a certificate generator
            X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
            X500Principal dnName = new X500Principal("cn=example");
    
            // add some options
            certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
            certGen.setSubjectDN(new X509Name("dc=name"));
            certGen.setIssuerDN(dnName); // use the same
            // yesterday
            certGen.setNotBefore(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000));
            // in 2 years
            certGen.setNotAfter(new Date(System.currentTimeMillis() + 2 * 365 * 24 * 60 * 60 * 1000));
            certGen.setPublicKey(keyPair.getPublic());
            certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
            certGen.addExtension(X509Extensions.ExtendedKeyUsage, true,
                    new ExtendedKeyUsage(KeyPurposeId.id_kp_timeStamping));
    
            // finally, sign the certificate with the private key of the same KeyPair
            X509Certificate cert = certGen.generate(keyPair.getPrivate(), "BC");
            return cert;
        }
    
        public void addBouncyCastleAsSecurityProvider() {
            Security.addProvider(new BouncyCastleProvider());
        }
    }
    

    For certGen.generate(keyPair.getPrivate(), "BC"); to work, BouncyCastle has to be added as a Security Provider.

    I confirmed that it works with this maven dependency:

    
        org.bouncycastle
        bcprov-jdk16
        1.38
    
    

提交回复
热议问题