x509v1certificategenerator.java

来自「bouncycastle 是一个JAVA安全提供者」· Java 代码 · 共 298 行

JAVA
298
字号
package org.bouncycastle.x509;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.math.BigInteger;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.NoSuchProviderException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.SecureRandom;import java.security.Signature;import java.security.SignatureException;import java.security.cert.X509Certificate;import java.util.Date;import java.util.Iterator;import javax.security.auth.x500.X500Principal;import org.bouncycastle.asn1.ASN1EncodableVector;import org.bouncycastle.asn1.ASN1InputStream;import org.bouncycastle.asn1.ASN1Sequence;import org.bouncycastle.asn1.DERBitString;import org.bouncycastle.asn1.DERInteger;import org.bouncycastle.asn1.DERNull;import org.bouncycastle.asn1.DERObjectIdentifier;import org.bouncycastle.asn1.DEROutputStream;import org.bouncycastle.asn1.DERSequence;import org.bouncycastle.asn1.x509.AlgorithmIdentifier;import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;import org.bouncycastle.asn1.x509.TBSCertificateStructure;import org.bouncycastle.asn1.x509.Time;import org.bouncycastle.asn1.x509.V1TBSCertificateGenerator;import org.bouncycastle.asn1.x509.X509CertificateStructure;import org.bouncycastle.asn1.x509.X509Name;import org.bouncycastle.jce.X509Principal;import org.bouncycastle.jce.provider.X509CertificateObject;/** * class to produce an X.509 Version 1 certificate. */public class X509V1CertificateGenerator{    private V1TBSCertificateGenerator   tbsGen;    private DERObjectIdentifier         sigOID;    private AlgorithmIdentifier         sigAlgId;    private String                      signatureAlgorithm;    public X509V1CertificateGenerator()    {        tbsGen = new V1TBSCertificateGenerator();    }    /**     * reset the generator     */    public void reset()    {        tbsGen = new V1TBSCertificateGenerator();    }    /**     * set the serial number for the certificate.     */    public void setSerialNumber(        BigInteger      serialNumber)    {        tbsGen.setSerialNumber(new DERInteger(serialNumber));    }    /**     * Set the issuer distinguished name - the issuer is the entity whose private key is used to sign the     * certificate.     */    public void setIssuerDN(        X500Principal   issuer)    {        try        {            tbsGen.setIssuer(new X509Principal(issuer.getEncoded()));        }        catch (IOException e)        {            throw new IllegalArgumentException("can't process principal: " + e);        }    }        /**     * Set the issuer distinguished name - the issuer is the entity whose private key is used to sign the     * certificate.     */    public void setIssuerDN(        X509Name   issuer)    {        tbsGen.setIssuer(issuer);    }    public void setNotBefore(        Date    date)    {        tbsGen.setStartDate(new Time(date));    }    public void setNotAfter(        Date    date)    {        tbsGen.setEndDate(new Time(date));    }    /**     * Set the subject distinguished name. The subject describes the entity associated with the public key.     */    public void setSubjectDN(        X500Principal   subject)    {        try        {            tbsGen.setSubject(new X509Principal(subject.getEncoded()));        }        catch (IOException e)        {            throw new IllegalArgumentException("can't process principal: " + e);        }    }        /**     * Set the subject distinguished name. The subject describes the entity associated with the public key.     */    public void setSubjectDN(        X509Name   subject)    {        tbsGen.setSubject(subject);    }    public void setPublicKey(        PublicKey       key)    {        try        {            tbsGen.setSubjectPublicKeyInfo(new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(                                new ByteArrayInputStream(key.getEncoded())).readObject()));        }        catch (Exception e)        {            throw new IllegalArgumentException("unable to process key - " + e.toString());        }    }    /**     * Set the signature algorithm. This can be either a name or an OID, names     * are treated as case insensitive.     *      * @param signatureAlgorithm string representation of the algorithm name.     */    public void setSignatureAlgorithm(        String  signatureAlgorithm)    {        this.signatureAlgorithm = signatureAlgorithm;        try        {            sigOID = X509Util.getAlgorithmOID(signatureAlgorithm);        }        catch (Exception e)        {            throw new IllegalArgumentException("Unknown signature type requested");        }        sigAlgId = new AlgorithmIdentifier(this.sigOID, new DERNull());        tbsGen.setSignature(sigAlgId);    }    /**     * generate an X509 certificate, based on the current issuer and subject     * using the default provider "BC".     */    public X509Certificate generateX509Certificate(        PrivateKey      key)        throws SecurityException, SignatureException, InvalidKeyException    {        try        {            return generateX509Certificate(key, "BC", null);        }        catch (NoSuchProviderException e)        {            throw new SecurityException("BC provider not installed!");        }    }    /**     * generate an X509 certificate, based on the current issuer and subject     * using the default provider "BC" and the passed in source of randomness     */    public X509Certificate generateX509Certificate(        PrivateKey      key,        SecureRandom    random)        throws SecurityException, SignatureException, InvalidKeyException    {        try        {            return generateX509Certificate(key, "BC", random);        }        catch (NoSuchProviderException e)        {            throw new SecurityException("BC provider not installed!");        }    }    /**     * generate an X509 certificate, based on the current issuer and subject,     * using the passed in provider for the signing, and the passed in source     * of randomness (if required).     */    public X509Certificate generateX509Certificate(        PrivateKey      key,        String          provider)        throws NoSuchProviderException, SecurityException, SignatureException, InvalidKeyException    {        return generateX509Certificate(key, provider, null);    }    /**     * generate an X509 certificate, based on the current issuer and subject,     * using the passed in provider for the signing, and the passed in source     * of randomness (if required).     */    public X509Certificate generateX509Certificate(        PrivateKey      key,        String          provider,        SecureRandom    random)        throws NoSuchProviderException, SecurityException, SignatureException, InvalidKeyException    {        Signature sig = null;        try        {            sig = Signature.getInstance(sigOID.getId(), provider);        }        catch (NoSuchAlgorithmException ex)        {            try            {                sig = Signature.getInstance(signatureAlgorithm, provider);            }            catch (NoSuchAlgorithmException e)            {                throw new SecurityException("exception creating signature: " + e.toString());            }        }        if (random != null)        {            sig.initSign(key, random);        }        else        {            sig.initSign(key);        }        TBSCertificateStructure tbsCert = tbsGen.generateTBSCertificate();        try        {            ByteArrayOutputStream   bOut = new ByteArrayOutputStream();            DEROutputStream         dOut = new DEROutputStream(bOut);            dOut.writeObject(tbsCert);            sig.update(bOut.toByteArray());        }        catch (Exception e)        {            throw new SecurityException("exception encoding TBS cert - " + e);        }        ASN1EncodableVector  v = new ASN1EncodableVector();        v.add(tbsCert);        v.add(sigAlgId);        v.add(new DERBitString(sig.sign()));        return new X509CertificateObject(new X509CertificateStructure(new DERSequence(v)));    }        /**     * Return an iterator of the signature names supported by the generator.     *      * @return an iterator containing recognised names.     */    public Iterator getSignatureAlgNames()    {        return X509Util.getAlgNames();    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?