Skip to content
CertificateSigningRequest.java 2.43 KiB
Newer Older
package org.astrogrid.security.delegation;

import java.io.IOException;
import java.io.Writer;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SignatureException;

import org.bouncycastle.asn1.DERObject;
import org.bouncycastle.asn1.DERObjectIdentifier;
import org.bouncycastle.asn1.DERPrintableString;
import org.bouncycastle.asn1.DERUTF8String;
import org.bouncycastle.asn1.x509.X509DefaultEntryConverter;
import org.bouncycastle.asn1.x509.X509Name;
import org.bouncycastle.jce.PKCS10CertificationRequest;
import org.bouncycastle.openssl.PEMWriter;

/**
 * A CSR that can write itself out in PEM'd PKCS#10 format.
 *
 * @author Guy Rixon
 */
public class CertificateSigningRequest extends PKCS10CertificationRequest {
   
  /**
   * Constructs a CertificateSigningRequest.
   * The subject is taken in as a plain string. The signing
   * algorithm is fixed as MD5 digest, RSA encryption. This means that the
   * key-pair passed in must be RSA keys.
   *
   * @throws NoSuchAlgorithmException If the JCE-provider doesn't know MD5WITHRSA.
   * @throws NoSuchProviderException If the JCE-provider "BC" isn't registered.
   * @throws InvalidKeyException If the given keys are not RSA keys.
   */
  public CertificateSigningRequest(String identity, KeyPair keys) 
      throws InvalidKeyException, 
             SignatureException, NoSuchAlgorithmException, NoSuchProviderException {
    super("SHA256WITHRSA",
            new X509Name(identity, new X509DefaultEntryConverter() {
                @Override
                public DERObject getConvertedValue(DERObjectIdentifier oid,  String 
            val) {
                    DERObject obj = super.getConvertedValue(oid, val);
                    if (obj instanceof DERUTF8String)
                        return new DERPrintableString(val);
                    else
                        return obj;
                    }
                }),
            keys.getPublic(),
            null,
            keys.getPrivate(),
            "BC");
  }
  
  public CertificateSigningRequest(PKCS10CertificationRequest req)
  {
      super(req.getEncoded());
  }
  
    /**
     * Writes out the CSR as a PEM-encoded PKCS#10 artifact.
     */
    public void writePem(Writer out) throws IOException
    {
        PEMWriter pem = new PEMWriter(out);
        pem.writeObject(this);
        pem.flush();
    }
}