Sign CSR using Bouncy Castle

后端 未结 5 544
我寻月下人不归
我寻月下人不归 2020-11-27 11:04

I cannot find any code/doc describing how to sign a CSR using BC. As input I have a CSR as a byte array and would like to get the cert in PEM and/or DER format.

I ha

5条回答
  •  执念已碎
    2020-11-27 11:30

    In the end, this is what worked for me:

    KeyPair serverKeyPair = keyPairLoader.getKeyPair(); //my own class
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509", "BC");
    X509Certificate serverCertificate = getServerCertificate(certificateFactory);
    
    org.spongycastle.asn1.x509.Certificate eeX509CertificateStructure = signCertificateSigningRequest(
      jcaPKCS10CertificationRequest, keyPair, serverCertificate);
    
    java.security.cert.X509Certificate signedCertificate = readCertificateFromASN1Certificate(
      eeX509CertificateStructure, certificateFactory);
    

    Where code is

      private org.spongycastle.asn1.x509.Certificate signCertificateSigningRequest(
        JcaPKCS10CertificationRequest jcaPKCS10CertificationRequest,
        KeyPair keyPair, X509Certificate serverCertificate)
          throws IOException, OperatorCreationException, NoSuchAlgorithmException, InvalidKeyException
      {
        // Signing CSR
        AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder()
          .find("SHA1withRSA");
    
        X509v3CertificateBuilder certificateBuilder = new JcaX509v3CertificateBuilder(
            serverCertificate, 
            new BigInteger("1"), //serial
            new Date(System.currentTimeMillis()),
            new Date(System.currentTimeMillis() + 30L * 365L * 24L * 60L * 60L * 1000L),
            jcaPKCS10CertificationRequest.getSubject(),
            jcaPKCS10CertificationRequest.getPublicKey()
        /*).addExtension(
            new ASN1ObjectIdentifier("2.5.29.35"),
            false,
            new AuthorityKeyIdentifier(keyPair.getPublic().getEncoded())*/
        ).addExtension(
                new ASN1ObjectIdentifier("2.5.29.19"),
                false,
                new BasicConstraints(false) // true if it is allowed to sign other certs
        ).addExtension(
                new ASN1ObjectIdentifier("2.5.29.15"),
                true,
                new X509KeyUsage(
                    X509KeyUsage.digitalSignature |
                        X509KeyUsage.nonRepudiation   |
                        X509KeyUsage.keyEncipherment  |
                        X509KeyUsage.dataEncipherment));
    
        AsymmetricKeyParameter asymmetricKeyParameter =
              PrivateKeyFactory.createKey(keyPair.getPrivate().getEncoded());
        //ContentSigner sigGen = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(asymmetricKeyParameter);
        ContentSigner sigGen = new JcaContentSignerBuilder("SHA1withRSA").build(keyPair.getPrivate());
    
    
        X509CertificateHolder x509CertificateHolder = certificateBuilder.build(sigGen);
        org.spongycastle.asn1.x509.Certificate eeX509CertificateStructure =
          x509CertificateHolder.toASN1Structure();
        return eeX509CertificateStructure;
      }
    
      private X509Certificate readCertificateFromASN1Certificate(
        org.spongycastle.asn1.x509.Certificate eeX509CertificateStructure,
        CertificateFactory certificateFactory)
        throws IOException, CertificateException {
        // Read Certificate
        InputStream is1 = new ByteArrayInputStream(eeX509CertificateStructure.getEncoded());
        X509Certificate signedCertificate =
          (X509Certificate) certificateFactory.generateCertificate(is1);
        return signedCertificate;
      }
    

    And this can be converted to PEM:

      private String convertCertificateToPEM(X509Certificate signedCertificate) throws IOException {
        StringWriter signedCertificatePEMDataStringWriter = new StringWriter();
        JcaPEMWriter pemWriter = new JcaPEMWriter(signedCertificatePEMDataStringWriter);
        pemWriter.writeObject(signedCertificate);
        pemWriter.close();
        log.info("PEM data:");
        log.info("" + signedCertificatePEMDataStringWriter.toString());
        return signedCertificatePEMDataStringWriter.toString();
      }
    

提交回复
热议问题