📄 x509ca.java
字号:
/************************************************************************* * * * EJBCA: The OpenSource Certificate Authority * * * * This software is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or any later version. * * * * See terms of license at gnu.org. * * * *************************************************************************/ package se.anatom.ejbca.ca.caadmin;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.math.BigInteger;import java.security.KeyPair;import java.security.NoSuchProviderException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.cert.CRL;import java.security.cert.Certificate;import java.security.cert.X509CRL;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.StringTokenizer;import java.util.Vector;import org.apache.log4j.Logger;import org.bouncycastle.asn1.ASN1EncodableVector;import org.bouncycastle.asn1.ASN1Sequence;import org.bouncycastle.asn1.DEREncodableVector;import org.bouncycastle.asn1.DERIA5String;import org.bouncycastle.asn1.DERInputStream;import org.bouncycastle.asn1.DERObject;import org.bouncycastle.asn1.DERObjectIdentifier;import org.bouncycastle.asn1.DEROctetString;import org.bouncycastle.asn1.DERSequence;import org.bouncycastle.asn1.DERTaggedObject;import org.bouncycastle.asn1.DERUTF8String;import org.bouncycastle.asn1.x509.AuthorityInformationAccess;import org.bouncycastle.asn1.x509.AuthorityKeyIdentifier;import org.bouncycastle.asn1.x509.BasicConstraints;import org.bouncycastle.asn1.x509.CRLDistPoint;import org.bouncycastle.asn1.x509.CRLNumber;import org.bouncycastle.asn1.x509.DistributionPoint;import org.bouncycastle.asn1.x509.DistributionPointName;import org.bouncycastle.asn1.x509.ExtendedKeyUsage;import org.bouncycastle.asn1.x509.GeneralName;import org.bouncycastle.asn1.x509.GeneralNames;import org.bouncycastle.asn1.x509.PolicyInformation;import org.bouncycastle.asn1.x509.SubjectKeyIdentifier;import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;import org.bouncycastle.asn1.x509.X509Extensions;import org.bouncycastle.asn1.x509.X509Name;import org.bouncycastle.asn1.x509.X509ObjectIdentifiers;import org.bouncycastle.cms.CMSEnvelopedData;import org.bouncycastle.cms.CMSEnvelopedDataGenerator;import org.bouncycastle.cms.CMSProcessableByteArray;import org.bouncycastle.cms.RecipientInformation;import org.bouncycastle.cms.RecipientInformationStore;import org.bouncycastle.jce.PKCS7SignedData;import org.bouncycastle.jce.X509KeyUsage;import org.bouncycastle.jce.X509V2CRLGenerator;import org.bouncycastle.jce.X509V3CertificateGenerator;import org.bouncycastle.ocsp.BasicOCSPResp;import org.bouncycastle.ocsp.BasicOCSPRespGenerator;import org.bouncycastle.ocsp.OCSPException;import org.bouncycastle.util.encoders.Hex;import se.anatom.ejbca.SecConst;import se.anatom.ejbca.ca.auth.UserAuthData;import se.anatom.ejbca.ca.caadmin.extendedcaservices.ExtendedCAServiceNotActiveException;import se.anatom.ejbca.ca.caadmin.extendedcaservices.ExtendedCAServiceRequest;import se.anatom.ejbca.ca.caadmin.extendedcaservices.ExtendedCAServiceRequestException;import se.anatom.ejbca.ca.caadmin.extendedcaservices.ExtendedCAServiceResponse;import se.anatom.ejbca.ca.caadmin.extendedcaservices.IllegalExtendedCAServiceRequestException;import se.anatom.ejbca.ca.caadmin.extendedcaservices.OCSPCAServiceRequest;import se.anatom.ejbca.ca.caadmin.extendedcaservices.OCSPCAServiceResponse;import se.anatom.ejbca.ca.crl.RevokedCertInfo;import se.anatom.ejbca.ca.exception.CATokenOfflineException;import se.anatom.ejbca.ca.exception.IllegalKeyStoreException;import se.anatom.ejbca.ca.exception.SignRequestSignatureException;import se.anatom.ejbca.ca.sign.SernoGenerator;import se.anatom.ejbca.ca.store.certificateprofiles.CertificateProfile;import se.anatom.ejbca.util.CertTools;import se.anatom.ejbca.util.StringTools;/** * X509CA is a implementation of a CA and holds data specific for Certificate and CRL generation * according to the X509 standard. * * @version $Id: X509CA.java,v 1.27.2.1 2004/06/30 08:41:22 anatom Exp $ */public class X509CA extends CA implements Serializable { private static Logger log = Logger.getLogger(X509CA.class); // Default Values public static final float LATEST_VERSION = 1; private X509Name subjectx509name = null; private byte[] keyId = new byte[] { 1, 2, 3, 4, 5 }; // protected fields. protected static final String POLICYID = "policyid"; protected static final String SUBJECTALTNAME = "subjectaltname"; protected static final String USEAUTHORITYKEYIDENTIFIER = "useauthoritykeyidentifier"; protected static final String AUTHORITYKEYIDENTIFIERCRITICAL = "authoritykeyidentifiercritical"; protected static final String USECRLNUMBER = "usecrlnumber"; protected static final String CRLNUMBERCRITICAL = "crlnumbercritical"; // Public Methods /** Creates a new instance of CA, this constuctor should be used when a new CA is created */ public X509CA(X509CAInfo cainfo) { super((CAInfo) cainfo); data.put(POLICYID, cainfo.getPolicyId()); data.put(SUBJECTALTNAME, cainfo.getSubjectAltName()); setUseAuthorityKeyIdentifier(cainfo.getUseAuthorityKeyIdentifier()); setAuthorityKeyIdentifierCritical(cainfo.getAuthorityKeyIdentifierCritical()); setUseCRLNumber(cainfo.getUseCRLNumber()); setCRLNumberCritical(cainfo.getCRLNumberCritical()); setFinishUser(cainfo.getFinishUser()); data.put(CA.CATYPE, new Integer(CAInfo.CATYPE_X509)); data.put(VERSION, new Float(LATEST_VERSION)); } /** Constructor used when retrieving existing X509CA from database. */ public X509CA(HashMap data, CADataBean owner){ super(data, owner); } // Public Methods. public String getPolicyId(){ return (String) data.get(POLICYID);} public void setPolicyId(String policyid){ data.put(POLICYID, policyid);} public String getSubjectAltName() { return (String) data.get(SUBJECTALTNAME);} public boolean getUseAuthorityKeyIdentifier(){ return ((Boolean)data.get(USEAUTHORITYKEYIDENTIFIER)).booleanValue(); } public void setUseAuthorityKeyIdentifier(boolean useauthoritykeyidentifier) { data.put(USEAUTHORITYKEYIDENTIFIER, new Boolean(useauthoritykeyidentifier)); } public boolean getAuthorityKeyIdentifierCritical(){ return ((Boolean)data.get(AUTHORITYKEYIDENTIFIERCRITICAL)).booleanValue(); } public void setAuthorityKeyIdentifierCritical(boolean authoritykeyidentifiercritical) { data.put(AUTHORITYKEYIDENTIFIERCRITICAL, new Boolean(authoritykeyidentifiercritical)); } public boolean getUseCRLNumber(){return ((Boolean)data.get(USECRLNUMBER)).booleanValue();} public void setUseCRLNumber(boolean usecrlnumber) {data.put(USECRLNUMBER, new Boolean(usecrlnumber));} public boolean getCRLNumberCritical(){return ((Boolean)data.get(CRLNUMBERCRITICAL)).booleanValue();} public void setCRLNumberCritical(boolean crlnumbercritical) {data.put(CRLNUMBERCRITICAL, new Boolean(crlnumbercritical));} public void updateCA(CAInfo cainfo) throws Exception{ super.updateCA(cainfo); X509CAInfo info = (X509CAInfo) cainfo; setUseAuthorityKeyIdentifier(info.getUseAuthorityKeyIdentifier()); setAuthorityKeyIdentifierCritical(info.getAuthorityKeyIdentifierCritical()); setUseCRLNumber(info.getUseCRLNumber()); setCRLNumberCritical(info.getCRLNumberCritical()); } public CAInfo getCAInfo() throws Exception{ ArrayList externalcaserviceinfos = new ArrayList(); Iterator iter = getExternalCAServiceTypes().iterator(); while(iter.hasNext()){ externalcaserviceinfos.add(this.getExtendedCAServiceInfo(((Integer) iter.next()).intValue())); } return new X509CAInfo(getSubjectDN(), getName(), getStatus(), getSubjectAltName() ,getCertificateProfileId(), getValidity(), getExpireTime(), getCAType(), getSignedBy(), getCertificateChain(), getCAToken().getCATokenInfo(), getDescription(), getRevokationReason(), getRevokationDate(), getPolicyId(), getCRLPeriod(), getCRLPublishers(), getUseAuthorityKeyIdentifier(), getAuthorityKeyIdentifierCritical(), getUseCRLNumber(), getCRLNumberCritical(), getFinishUser(), externalcaserviceinfos); } public byte[] createPKCS7(Certificate cert) throws SignRequestSignatureException { // First verify that we signed this certificate try { if (cert != null) cert.verify(getCAToken().getPublicKey(SecConst.CAKEYPURPOSE_CERTSIGN), getCAToken().getProvider()); } catch (Exception e) { throw new SignRequestSignatureException("Cannot verify certificate in createPKCS7(), did I sign this?"); } Collection chain = getCertificateChain(); Certificate[] certs; if (cert != null) { certs = new Certificate[chain.size()+1]; certs[0] = cert; Iterator iter = chain.iterator(); int i=1; while(iter.hasNext()){ certs[i] = (Certificate) iter.next(); i++; } } else { certs = (Certificate[]) chain.toArray(new Certificate[chain.size()]); } try { PKCS7SignedData pkcs7 = new PKCS7SignedData(getCAToken().getPrivateKey(SecConst.CAKEYPURPOSE_CERTSIGN),certs,"SHA1",getCAToken().getProvider()); return pkcs7.getEncoded(); } catch (CATokenOfflineException e) { this.setStatus(SecConst.CA_OFFLINE); throw new javax.ejb.EJBException(e); } catch (Exception e) { throw new javax.ejb.EJBException(e); } } public Certificate generateCertificate(UserAuthData subject, PublicKey publicKey, int keyusage, long validity, CertificateProfile certProfile) throws Exception{ final String sigAlg = getCAToken().getCATokenInfo().getSignatureAlgorithm(); Date firstDate = new Date(); // Set back startdate ten minutes to avoid some problems with wrongly set clocks. firstDate.setTime(firstDate.getTime() - 10 * 60 * 1000); Date lastDate = new Date(); // validity in days = validity*24*60*60*1000 milliseconds long val = validity; if(val == -1) val = certProfile.getValidity(); lastDate.setTime(lastDate.getTime() + ( val * 24 * 60 * 60 * 1000)); X509V3CertificateGenerator certgen = new X509V3CertificateGenerator(); // Serialnumber is random bits, where random generator is initialized by the // serno generator. BigInteger serno = SernoGenerator.instance().getSerno(); certgen.setSerialNumber(serno); certgen.setNotBefore(firstDate); certgen.setNotAfter(lastDate); certgen.setSignatureAlgorithm(sigAlg); // Make DNs String dn = subject.getDN(); String altName = subject.getAltName(); certgen.setSubjectDN(CertTools.stringToBcX509Name(dn)); X509Name caname = getSubjectDNAsX509Name(); certgen.setIssuerDN(caname); certgen.setPublicKey(publicKey); // Basic constranits, all subcerts are NOT CAs if (certProfile.getUseBasicConstraints() == true) { boolean isCA = false; if ((certProfile.getType() == CertificateProfile.TYPE_SUBCA) || (certProfile.getType() == CertificateProfile.TYPE_ROOTCA)) isCA = true; BasicConstraints bc = new BasicConstraints(isCA); certgen.addExtension( X509Extensions.BasicConstraints.getId(), certProfile.getBasicConstraintsCritical(), bc); } // Key usage int newKeyUsage = -1; if (certProfile.getAllowKeyUsageOverride() && (keyusage >= 0)) { newKeyUsage = keyusage; } else { newKeyUsage = sunKeyUsageToBC(certProfile.getKeyUsage()); } if ( (certProfile.getUseKeyUsage() == true) && (newKeyUsage >=0) ){ X509KeyUsage ku = new X509KeyUsage(newKeyUsage); certgen.addExtension( X509Extensions.KeyUsage.getId(), certProfile.getKeyUsageCritical(), ku); } // Extended Key usage if (certProfile.getUseExtendedKeyUsage() == true) { // Get extended key usage from certificate profile Collection c = certProfile.getExtendedKeyUsageAsOIDStrings(); Vector usage = new Vector(); Iterator iter = c.iterator(); while (iter.hasNext()) { usage.add(new DERObjectIdentifier((String)iter.next())); } ExtendedKeyUsage eku = new ExtendedKeyUsage(usage); // Extended Key Usage may be either critical or non-critical certgen.addExtension( X509Extensions.ExtendedKeyUsage.getId(), certProfile.getExtendedKeyUsageCritical(), eku); } // Subject key identifier if (certProfile.getUseSubjectKeyIdentifier() == true) { SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo( (ASN1Sequence) new DERInputStream(new ByteArrayInputStream(publicKey.getEncoded())).readObject()); SubjectKeyIdentifier ski = new SubjectKeyIdentifier(spki); certgen.addExtension( X509Extensions.SubjectKeyIdentifier.getId(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -