Self signed X509 Certificate with Bouncy Castle in Java

后端 未结 4 653
旧时难觅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:16

    Here's a complete self-signed ECDSA certificate generator that creates certificates usable in TLS connections on both client and server side. It was tested with BouncyCastle 1.57. Similar code can be used to create RSA certificates.

    SecureRandom random = new SecureRandom();
    
    // create keypair
    KeyPairGenerator keypairGen = KeyPairGenerator.getInstance("EC");
    keypairGen.initialize(256, random);
    KeyPair keypair = keypairGen.generateKeyPair();
    
    // fill in certificate fields
    X500Name subject = new X500NameBuilder(BCStyle.INSTANCE)
        .addRDN(BCStyle.CN, "stackoverflow.com")
        .build();
    byte[] id = new byte[20];
    random.nextBytes(id);
    BigInteger serial = new BigInteger(160, random);
    X509v3CertificateBuilder certificate = new JcaX509v3CertificateBuilder(
        subject,
        serial,
        Date.from(LocalDate.of(2000, 1, 1).atStartOfDay(ZoneOffset.UTC).toInstant()),
        Date.from(LocalDate.of(2035, 1, 1).atStartOfDay(ZoneOffset.UTC).toInstant()),
        subject,
        keypair.getPublic());
    certificate.addExtension(Extension.subjectKeyIdentifier, false, id);
    certificate.addExtension(Extension.authorityKeyIdentifier, false, id);
    BasicConstraints constraints = new BasicConstraints(true);
    certificate.addExtension(
        Extension.basicConstraints,
        true,
        constraints.getEncoded());
    KeyUsage usage = new KeyUsage(KeyUsage.keyCertSign | KeyUsage.digitalSignature);
    certificate.addExtension(Extension.keyUsage, false, usage.getEncoded());
    ExtendedKeyUsage usageEx = new ExtendedKeyUsage(new KeyPurposeId[] {
        KeyPurposeId.id_kp_serverAuth,
        KeyPurposeId.id_kp_clientAuth
    });
    certificate.addExtension(
        Extension.extendedKeyUsage,
        false,
        usageEx.getEncoded());
    
    // build BouncyCastle certificate
    ContentSigner signer = new JcaContentSignerBuilder("SHA256withECDSA")
        .build(keypair.getPrivate());
    X509CertificateHolder holder = certificate.build(signer);
    
    // convert to JRE certificate
    JcaX509CertificateConverter converter = new JcaX509CertificateConverter();
    converter.setProvider(new BouncyCastleProvider());
    X509Certificate x509 = converter.getCertificate(holder);
    
    // serialize in DER format
    byte[] serialized = x509.getEncoded();
    

提交回复
热议问题