public class ACRL extends java.security.cert.X509CRL implements ASN1Type
An Attribute Certificate Revocation List (ACRL) denotes a list of attribute certificates that have been revoked for some reason (e.g. the holder of the certificate has changed, ...) prior to the regular ending of its validity period. A CRL is maintained by a certification authority (CA) making it publicly available and refreshing it in certain time intervals. Each revoked certificate included in a revocation list can be identified by its serial number. The revocation list is signed by the maintaining CA.
A profile for X.509v2 revocation lists is presented together with the X.509v3 certificate format in RFC 3280, where a CRL is defined as an ASN.1 SEQUENCE structure containing the following components:
CertificateList ::= SEQUENCE { tbsCertList TBSCertList, signatureAlgorithm AlgorithmIdentifier, signatureValue BIT STRING }
where signatureAlgorithm identifies the signature algorithm used by
the signing certification authority for computing the digital signature upon
the ASN.1 DER encoded TBSCertList
structure, which itself is
expressed as ASN.1 SEQUENCE structure specifying the (distinguished) name of
the issuer, the issue date of the CRL, the date when the next CRL will be
issued, and optionally lists of revoked certificates (identified by their
serial numbers) and CRL extensions. The list of revoked certificates is
classified as being optional since a CA may not have revoked any issued
certificate when publishing a CRL.
ASN.1 definition:
TBSCertList ::= SEQUENCE { version Version OPTIONAL, -- if present, must be v2 signature AlgorithmIdentifier, issuer Name, thisUpdate Time, nextUpdate Time OPTIONAL, revokedCertificates SEQUENCE OF SEQUENCE { userCertificate CertificateSerialNumber, revocationDate Time, crlEntryExtensions Extensions OPTIONAL -- if present, must be v2 } OPTIONAL, crlExtensions [0] EXPLICIT Extensions OPTIONAL -- if present, must be v2 }
where:
Version ::= INTEGER { v1(0), v2(1), v3(2) } -- v3 does not apply to CRLs but appears for consistency -- with definition of Version for certs
AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } -- contains a value of the type -- registered for use with the -- algorithm object identifier value
Name ::= CHOICE { RDNSequence }
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE { type AttributeType, value AttributeValue }
AttributeType ::= OBJECT IDENTIFIER
AttributeValue ::= ANY -- Directory string type --
DirectoryString ::= CHOICE { teletexString TeletexString (SIZE (1..MAX)), printableString PrintableString (SIZE (1..MAX)), universalString UniversalString (SIZE (1..MAX)), utf8String UTF8String (SIZE (1..MAX)), bmpString BMPString (SIZE (1..MAX)) } }
Time ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }
CertificateSerialNumber ::= INTEGER
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE { extnID OBJECT IDENTIFIER, critical BOOLEAN DEFAULT FALSE, extnValue OCTET STRING }
For a detail description of the several fields refer to RFC 3280.
For each value exists a setValue()
and a getValue()
method. After creating a ACRL, the, for instance, CRL issuing date may be set
to the current date by using the setThisUpdate
method:
ACRL crl = new ACRL(); GregorianCalendar date = (GregorianCalendar) Calendar.getInstance(); crl.setThisUpdate(date.getTime());
Manipulating the extensions of a CRL is described in class
X509Extensions
. A CRL extension (support
introduced by the X.509v2 CRL format) may be a defined standard
extension (e.g. CRLNumber
, ...), or it may be a private
extension providing some community-specific information. If an extension is
marked as critical, but the CRL handling software cannot parse this
extension, the CRL validation must fail. Non-Critical extensions can
be ignored, if they cannot be handled (i.e. of unknown state).
For adding some extension to a ACRL use the
addExtension
method. The CRL profile
presented in RFC 3280
requires confirming CAs to support the CRL number extension conveying a
monotonically increasing sequence number for each CRL issued by a given CA
through a specific CA X.500 Directory entry or CRL distribution point, e.g.:
ACRL crl = new ACRL(); ... CRLNumber crl_number = new CRLNumber(BigInteger.valueOf(4234234)); crl.addExtension(crl_number);
A AttributeCertificate
to be revoked may be
added by means of the addCertificate(AttributeCertificate cert, Date revocationDate)
method.
Alternatively an instance of RevokedAttributeCertificate
may be added by using the
addCertificate(RevokedAttributeCertificate revokedCertificate)
method. For
finally signing the CRL with the CRL issuer's private key, call the
sign
method.
The ACRL(byte[])
and ACRL(InputStream)
constructors may be used for parsing an ACRL from its DER
encoding.
This class supports indirect CRLs, i.e. revocation of attribute certificates
where certificate issuer is different than the CRL issuer. Some caveats apply
though. Firstly, the methods isRevoked(BigInteger)
,
containsCertificate(BigInteger)
implicitly assume the CRL issuer
as the certificate issuer. Secondly, when encoding an indirect CRL the
certificate issuer CRL entry extension is automatically added to entries
where needed. However, the issuing distribution point CRL extension also
required for indirect CRLs has to be added manually. Thirdly the membership
of an attribute certificate to an indirect crl can be only checked if the
certificate does contain a issuer distinguished name in its
attCertIssuer
field. According to the PKIX Attribute Certificate
Profile the issuer of an attribute certificate must be the V2Form
choice containing an issuer dn in its issuerName
field.
Thus this class checks if the issuerName
field in the
V2Form
choice is present and contains a distinguished name. If
yes, the distinguished name is compared to the one of the CRL issuer to see
if the corresponding crl entry refers the certificate indirectly. If no
issuer dn is included in the attribute certificate the corresponding crl is
assumed to be a direct crl. If the issuer of an attribute certificate is
represented as V1Form
that contains an issuer dn, the same check
is done as for a V2Form
issuerName dn.
AttributeCertificate
,
RevokedAttributeCertificate
Constructor and Description |
---|
ACRL()
Default constructor for creating a new empty X.509 Attribute Certificate
CRL.
|
ACRL(ASN1Object asn1CRL)
Creates a ACRL form a ASN1Object.
|
ACRL(byte[] crl)
Creates a CRL form a PEM or DER byte array.
|
ACRL(java.io.InputStream is)
Creates a CRL from an input stream supplying a DER or PEM encoded CRL.
|
Modifier and Type | Method and Description |
---|---|
void |
addCertificate(AttributeCertificate cert,
java.util.Date revocationDate)
Adds a attribute certificate to the CRL to be revoked on the given date.
|
void |
addCertificate(RevokedAttributeCertificate revokedCert)
Adds a revoked certificate to the CRL.
|
void |
addExtension(V3Extension e)
Adds the given X509v2 CRL extension.
|
RevokedCertificate |
containsCertificate(AttributeCertificate cert)
Checks, if the CRL contains the given certificate.
|
RevokedCertificate |
containsCertificate(java.math.BigInteger serialNumber)
Checks, if the CRL contains a certificate with the given serial number.
|
int |
countExtensions()
Returns the number of extensions included into this CRL.
|
void |
decode(ASN1Object crl)
Decodes a CRL from an ASN1Object.
|
java.util.Set |
getCriticalExtensionOIDs()
Returns a Set of the OID strings identifying the extension(s) that are
marked CRITICAL in this CRL.
|
byte[] |
getEncoded()
Returns this CRL as DER encoded ASN.1 data structure.
|
V3Extension |
getExtension(ObjectID oid)
Returns a specific extension, identified by its object identifier.
|
byte[] |
getExtensionValue(java.lang.String oid)
Returns a byte array representing the DER encoding of the extension value
identified by the passed-in OID string.
|
byte[] |
getFingerprint()
Returns the fingerprint of this CRL.
|
byte[] |
getFingerprint(java.lang.String digestAlgorithm)
Returns the fingerprint of this crl calculated with the given hash
algorithm.
|
byte[] |
getFingerprintSHA()
Gets the SHA-1 fingerprint of this CRL.
|
java.security.Principal |
getIssuerDN()
Returns the Distinguished Name of the issuer of this CRL, as
Principal . |
java.util.Enumeration |
getIssuerDNs()
Return the names of all issuers of this CRL.
|
java.util.Date |
getNextUpdate()
Returns the date of
nextUpdate . |
java.util.Set |
getNonCriticalExtensionOIDs()
Returns a Set of the OID strings for the extension(s) marked NON-CRITICAL
in this CRL.
|
java.security.cert.X509CRLEntry |
getRevokedCertificate(java.math.BigInteger serialNumber)
Searches the CRL for the specified serial number and returns the
appertaining revoked certificate, if included into this CRL.
|
java.security.cert.X509CRLEntry |
getRevokedCertificate(java.security.cert.X509Certificate certificate)
Checks, if the CRL contains the given certificate.
|
java.util.Set |
getRevokedCertificates()
Returns a set containing all the revoked certificates included into this
CRL.
|
java.lang.String |
getSigAlgName()
Returns the (JCA standard) name of the signature algorithm used by the issuer for signing
this CRL.
|
java.lang.String |
getSigAlgOID()
Returns the OID of the signature algorithm used by the issuer for signing
this CRL.
|
byte[] |
getSigAlgParams()
Returns the algorithm parameters associated with the signature algorithm
used by the issuer for signing this CRL.
|
byte[] |
getSignature()
Returns the signature of this CRL.
|
AlgorithmID |
getSignatureAlgorithm()
Returns the signature algorithm of this CRL.
|
byte[] |
getTBSCertList()
Returns the
TBSCertList inherent to this CRL as DER encoded
ASN.1 structure. |
java.util.Date |
getThisUpdate()
Returns the date of
thisUpdate . |
int |
getVersion()
Returns the version number of this CRL as
int . |
boolean |
hasExtensions()
Checks, if there are any extensions included into this CRL.
|
boolean |
hasUnsupportedCriticalExtension()
Returns true if there are unsupported critical extensions.
|
boolean |
isIndirectCRL()
Return whether this CRL is an indirect CRL.
|
boolean |
isRevoked(java.math.BigInteger serialNumber)
Checks if the attribute certificate identified by the given serial number
is marked as revoked by this CRL.
|
boolean |
isRevoked(java.security.cert.Certificate cert)
Checks whether the given certificate is on this CRL.
|
java.util.Enumeration |
listCertificates()
Returns an enumeration of the revoked certificates this CRL contains.
|
java.util.Enumeration |
listExtensions()
Returns an enumeration of all extensions included into this CRL.
|
void |
removeAllCertificates()
Removes all certificates from the CRL.
|
void |
removeAllExtensions()
Removes all extensions from this CRL.
|
boolean |
removeCertificate(AttributeCertificate cert)
Removes the certificate from the CRL.
|
boolean |
removeCertificate(java.math.BigInteger serialNumber)
Removes the certificate with the given serial number from the CRL.
|
boolean |
removeExtension(ObjectID oid)
Removes the extension specified by its object identifier.
|
void |
setIssuerDN(java.security.Principal issuer)
Sets the issuer of this CRL.
|
void |
setNextUpdate(java.util.Date nextUpdate)
Sets the date of
nextUpdate . |
void |
setSignature(byte[] signatureValue)
Sets the signature value of this crl.
|
void |
setSignatureAlgorithm(AlgorithmID signatureAlg)
Sets the signature algorithm for signing this CRL.
|
void |
setThisUpdate(java.util.Date thisUpdate)
Sets the date of
thisUpdate . |
void |
sign(java.security.PrivateKey privateKey)
Signs the CRL with the private key of the issuer.
|
void |
sign(java.security.PrivateKey privateKey,
java.security.spec.AlgorithmParameterSpec signatureParams,
java.security.Provider provider)
Signs the ACRL with the private key of the issuer.
|
void |
sign(java.security.PrivateKey privateKey,
java.security.spec.AlgorithmParameterSpec signatureParams,
java.lang.String providerName)
Signs the ACRL with the private key of the issuer.
|
void |
sign(java.security.PrivateKey privateKey,
java.security.Provider provider)
Signs the ACRL with the private key of the issuer.
|
void |
sign(java.security.PrivateKey privateKey,
java.lang.String providerName)
Signs the ACRL with the private key of the issuer.
|
ASN1Object |
toASN1Object()
Returns the CRL as an ASN1Object.
|
byte[] |
toByteArray()
Returns the CRL as a DER encoded ASN.1 data structure.
|
java.lang.String |
toString()
Returns a string that represents the contents of the CRL.
|
java.lang.String |
toString(boolean detailed)
Returns a string giving some - if requested - detailed information about
the contents of the CRL.
|
void |
verify(java.security.PublicKey key)
Verifies a signed CRL using the given public key.
|
void |
verify(java.security.PublicKey key,
java.security.Provider provider)
Uses the given public key to verify this ACRL based on a signature algorithm
supplied by the specified provider.
|
void |
verify(java.security.PublicKey key,
java.lang.String providerName)
Uses the given public key to verify this ACRL based on a signature algorithm
supplied by the specified provider.
|
void |
writeTo(java.io.OutputStream os)
Writes the CRL DER encoded to the given output stream.
|
public ACRL()
Any value may be set using the corresponding the
set<Value>
method. The version number per default is set
to 1
indicating a Version 1
CRL. When
extensions are added
, the version field
automatically is set to 2.
public ACRL(java.io.InputStream is) throws java.io.IOException, java.security.cert.CRLException
This constructor reads a DER or PEM encoded ACRL that previously may have
been written with method writeTo(OutputStream)
.
For instance:
InputStream fis = new FileInputStream("crl.der"); ACRL crl = new ACRL(fis); fis.close();
is
- InputStream from which to create the CRLjava.io.IOException
- if the CRL could not be readjava.security.cert.CRLException
- if there is a problem when parsing the CRLpublic ACRL(byte[] crl) throws java.security.cert.CRLException
This constructor may be used for parsing an already existing
ACRL
ASN.1 object, supplied as DER encoded byte array, which
may have been created by calling the toByteArray
or
the getEncoded
method.
crl
- the byte array which contains the CRLjava.security.cert.CRLException
- if there is a problem when parsing the CRLpublic ACRL(ASN1Object asn1CRL) throws java.security.cert.CRLException
This constructor may be used for parsing an already existing
ACRL
, supplied as ASN.1 object.
asn1CRL
- the crl as ASN1Objectjava.security.cert.CRLException
- if the format of the CRL is wrongpublic void decode(ASN1Object crl) throws CodingException
The given ASN1Object represents an already existing ACRL which may have
been created by calling the toASN1Object
method.
decode
in interface ASN1Type
crl
- the ASN1Object which contains the CRLCodingException
- if there is a problem when parsing the CRLpublic boolean isIndirectCRL()
public void sign(java.security.PrivateKey privateKey) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException
privateKey
- the private key of the issuerjava.security.cert.CRLException
- if the CRL could not be createdjava.security.InvalidKeyException
- if the private key is not validjava.security.NoSuchAlgorithmException
- if the requested signature algorithm is not supportedpublic void sign(java.security.PrivateKey privateKey, java.lang.String providerName) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException
privateKey
- the private key of the issuerproviderName
- the name of the provider supplying the Signature engine to be used;
if null
the first available provider will be used
the supports the signature algorithmjava.security.cert.CRLException
- if the CRL could not be createdjava.security.InvalidKeyException
- if the private key is not validjava.security.NoSuchAlgorithmException
- if the requested signature algorithm is not supportedpublic void sign(java.security.PrivateKey privateKey, java.security.spec.AlgorithmParameterSpec signatureParams, java.lang.String providerName) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.InvalidAlgorithmParameterException
privateKey
- the private key of the issuersignatureParams
- any signature parameters to -- if not null
-- be
used for initializing the Signature engine; if applicable the parameters
are also set for the signatureAlg
AlgorithmID (if it
does not contain any parameters yet)providerName
- the name of the provider supplying the Signature engine to be used;
if null
the first available provider will be used
the supports the signature algorithmjava.security.cert.CRLException
- if the CRL could not be createdjava.security.InvalidKeyException
- if the private key is not validjava.security.NoSuchAlgorithmException
- if the requested signature algorithm is not supportedjava.security.InvalidAlgorithmParameterException
- if an error occurs when trying to set the signature parameterspublic void sign(java.security.PrivateKey privateKey, java.security.Provider provider) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException
This method uses a Signature
engine from the given provider
for signing the ACRL.
If Provider object based JCA/JCE Signature engine instantiation
is not available the Java VM in use (<1.4), this method tries to get an implementation
based on the provider name (if the Provider is installed within the Security Provider
framework). I.e. if method Signature.getInstance(algorithm,provider)
is not available method Signature.getInstance(algorithm,provider.getName())
is tried.
privateKey
- the private key of the issuerprovider
- the provider supplying the Signature engine to be used;
if null
the first available provider will be used
the supports the signature algorithmjava.security.cert.CRLException
- if the CRL could not be createdjava.security.InvalidKeyException
- if the private key is not validjava.security.NoSuchAlgorithmException
- if the requested signature algorithm is not supportedpublic void sign(java.security.PrivateKey privateKey, java.security.spec.AlgorithmParameterSpec signatureParams, java.security.Provider provider) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.InvalidAlgorithmParameterException
This method uses a Signature
engine from the given provider
for signing the ACRL.
If Provider object based JCA/JCE Signature engine instantiation
is not available the Java VM in use (<1.4), this method tries to get an implementation
based on the provider name (if the Provider is installed within the Security Provider
framework). I.e. if method Signature.getInstance(algorithm,provider)
is not available method Signature.getInstance(algorithm,provider.getName())
is tried.
privateKey
- the private key of the issuersignatureParams
- any signature parameters to -- if not null
-- be
used for initializing the Signature engine; if applicable the parameters
are also set for the signatureAlg
AlgorithmID (if it
does not contain any parameters yet)provider
- the provider supplying the Signature engine to be used;
if null
the first available provider will be used
the supports the signature algorithmjava.security.cert.CRLException
- if the CRL could not be createdjava.security.InvalidKeyException
- if the private key is not validjava.security.NoSuchAlgorithmException
- if the requested signature algorithm is not supportedjava.security.InvalidAlgorithmParameterException
- if an error occurs when trying to set the signature parameterspublic void setSignature(byte[] signatureValue) throws java.security.cert.CRLException
This method provides an alternative to method sign
when it is
required to set the signature value from outside (e.g. calculated by means
of a smartcard):
ACRL crl = ...; ... // set issuer, revoked certificates, ... ... // set the signature algorithm to be used for signing crl.setSignatureAlgorithm(AlgorithmID.sha1WithRSAEncryption); // get the to-be-signed value byte[] tbs = crl.getTBSCertList(); // now calculate the signature over the tbs cert list byte[] signatureValue = calculateSignature(tbs); // and set the signatureValue crl.setSignature(signatureValue); // encode the crl byte[] encodedCrl = crl.getEncoded();
signatureValue
- the signature calculated outsidejava.security.cert.CRLException
- if the CRL could not be createdpublic void verify(java.security.PublicKey key, java.lang.String providerName) throws java.security.cert.CRLException, java.security.NoSuchAlgorithmException, java.security.InvalidKeyException, java.security.NoSuchProviderException, java.security.SignatureException
verify
in class java.security.cert.X509CRL
key
- the public key of the CRL issuerproviderName
- the name of the provider supplying the Signature engine to be used;
if null
the first available provider will be used
the supports the signature algorithmjava.security.cert.CRLException
- if an encoding error occursjava.security.NoSuchAlgorithmException
- if there is no implementation for the algorithm used to sign
this CRLjava.security.InvalidKeyException
- if the format of the public key is wrongjava.security.NoSuchProviderException
- if there is no default providerjava.security.SignatureException
- if the signature does not verifypublic void verify(java.security.PublicKey key, java.security.Provider provider) throws java.security.cert.CRLException, java.security.NoSuchAlgorithmException, java.security.InvalidKeyException, java.security.SignatureException
This method uses a Signature
engine from the given provider
for verifying the ACRL.
If Provider object based JCA/JCE Signature engine instantiation
is not available the Java VM in use (<1.4), this method tries to get an implementation
based on the provider name (if the Provider is installed within the Security Provider
framework). I.e. if method Signature.getInstance(algorithm,provider)
is not available method Signature.getInstance(algorithm,provider.getName())
is tried.
key
- the public key of the ACRL issuerprovider
- the provider supplying the Signature engine to be used;
if null
the first available provider will be used
the supports the signature algorithmjava.security.cert.CRLException
- if an encoding error occursjava.security.NoSuchAlgorithmException
- if there is no implementation for the algorithm used to sign
this CRLjava.security.InvalidKeyException
- if the format of the public key is wrongjava.security.SignatureException
- if the signature does not verifypublic void verify(java.security.PublicKey key) throws java.security.cert.CRLException, java.security.NoSuchAlgorithmException, java.security.InvalidKeyException, java.security.NoSuchProviderException, java.security.SignatureException
verify(PublicKey key, String
sigProvider)
setting the provider name to null
for relying on
the default provider signature architecture.verify
in class java.security.cert.X509CRL
key
- the public key of the CRL issuerjava.security.cert.CRLException
- if an encoding error occursjava.security.NoSuchAlgorithmException
- if there is no implementation for the algorithm used to sign
this CRLjava.security.InvalidKeyException
- if the format of the public key is wrongjava.security.NoSuchProviderException
- if there is no default providerjava.security.SignatureException
- if the signature does not verifypublic boolean isRevoked(java.math.BigInteger serialNumber)
serialNumber
- the serial number of the certificate which is checked of being
revokedtrue
if the certificate identified by the given serial
number is marked as revoked by this CRL, false
if notpublic boolean isRevoked(java.security.cert.Certificate cert)
isRevoked
in class java.security.cert.CRL
cert
- the certificate to check forjava.lang.IllegalArgumentException
- if the given certificate cannot be converted to an AttributeCertificatepublic RevokedCertificate containsCertificate(AttributeCertificate cert)
The RevokedCertificate
object returned by this method may
represent an indirect CRL entry (certificate issuer != crl issuer) which
may (but must not) contain a CertificateIssuer
extension. It will contain a CertificateIssuer extension if it is the first
entry in the sequence of entries for the this certificate issuer. It may or
may not contain a CertificateIssuer extension if it is not the first entry
in the sequence of entries for this certificate issuer. However, the
certificate issuerDN is already known when calling this method, thus it is
not necessary to include a CertificateIssuer extension into the
RevokedCertificate.
Remember the order of entries in an indirect crl: it may start with direct
entries which refer to certificates that have been directly issued by the
crl issuer. These entries must not contain a CertificateIssuer extension.
Each sequence of entries that refer to certificates which have NOT been
issued by the crl issuer must start with a RevokedCertificate entry that
must contain a CertificateIssuer extension with the name of the certificate
issuer. The following entries must not contain a CertificateIssuer
extension as long as they have been issued by the same issuer, e.g.:
1. direct entry 2. direct entry ... 10. direct entry 11. indirect entry (with CertificateIssuer extension for CertIssuer 1) 12. indirect entry 13. indirect entry ... 18. indirect entry 19. indirect entry (with CertificateIssuer extension for CertIssuer 2) 20. indirect entry 21. indirect entry ... 24. indirect entry 25. indirect entry (with CertificateIssuer extension for CertIssuer 3) 26. indirect entry 27. indirect entry ... 34. indirect entryEntry 1 to 10 of this example crl are direct entries that refer to certificates that have been issued by the crl issuer. Entry 11 to 18 are indirect entries, all referring to certificates that have been issued by CertIssuer1. Entry 19 to 24 refer to certificates that have been issued by CertIssuer2, entry 25 to 34 refer to certificates that have been issued by CertIssuer3. Only the first entry (11., 19., 25.) for each cert issuer must contain the CertificateIssuer extension, any following entry belongs to the same certificate issuer as the preceding entry.
cert
- the certificate to checkpublic RevokedCertificate containsCertificate(java.math.BigInteger serialNumber)
The RevokedCertificate
object returned by this method may
represent an indirect CRL entry (certificate issuer != crl issuer) which
may (but must not) contain a CertificateIssuer
extension. It will contain a CertificateIssuer extension if it is the first
entry in the sequence of entries for the this certificate issuer. It may or
may not contain a CertificateIssuer extension if it is not the first entry
in the sequence of entries for this certificate issuer. However, the
certificate issuerDN is already known when calling this method, thus it is
not necessary to include a CertificateIssuer extension into the
RevokedCertificate.
Remember the order of entries in an indirect crl: it may start with direct
entries which refer to certificates that have been directly issued by the
crl issuer. These entries must not contain a CertificateIssuer extension.
Each sequence of entries that refer to certificates which have NOT been
issued by the crl issuer must start with a RevokedCertificate entry that
must contain a CertificateIssuer extension with the name of the certificate
issuer. The following entries must not contain a CertificateIssuer
extension as long as they have been issued by the same issuer, e.g.:
1. direct entry 2. direct entry ... 10. direct entry 11. indirect entry (with CertificateIssuer extension for CertIssuer 1) 12. indirect entry 13. indirect entry ... 18. indirect entry 19. indirect entry (with CertificateIssuer extension for CertIssuer 2) 20. indirect entry 21. indirect entry ... 24. indirect entry 25. indirect entry (with CertificateIssuer extension for CertIssuer 3) 26. indirect entry 27. indirect entry ... 34. indirect entryEntry 1 to 10 of this example crl are direct entries that refer to certificates that have been issued by the crl issuer. Entry 11 to 18 are indirect entries, all referring to certificates that have been issued by CertIssuer1. Entry 19 to 24 refer to certificates that have been issued by CertIssuer2, entry 25 to 34 refer to certificates that have been issued by CertIssuer3. Only the first entry (11., 19., 25.) for each cert issuer must contain the CertificateIssuer extension, any following entry belongs to the same certificate issuer as the preceding entry.
serialNumber
- the serial number of the certificatenull
if the CRL doesn't contain a certificate with
this serial number, the RevokedCertificate from the CRL otherwisepublic ASN1Object toASN1Object()
toASN1Object
in interface ASN1Type
public byte[] toByteArray()
public void writeTo(java.io.OutputStream os) throws java.io.IOException
os
- the output stream to which this CRL shall be writtenjava.io.IOException
- if an I/O error occurspublic void addCertificate(AttributeCertificate cert, java.util.Date revocationDate) throws java.security.cert.CRLException
GregorianCalendar date = (GregorianCalendar) Calendar.getInstance(); InputStream fis = new FileInputStream("cert.der"); AttributeCertificate cert = new AttributeCertificate(fis); fis.close(); crl.addCertificate(cert, date.getTime());
This method tries to check if the issuer dn (if included) of the given
attribute certificate is the same of the issuer of this crl (to decide
whether we have an indirect crl). This the issuer
field of the crl should be set before calling this method.
cert
- the attribute certificate which should be revokedrevocationDate
- the revocation datejava.security.cert.CRLException
- if the certificate cannot be addedpublic void addCertificate(RevokedAttributeCertificate revokedCert)
addCertificate(AttributeCertificate cert, Date
revocationDate)
which adds certificate, this method adds a
RevokedCertificate already including its revocation date, for instance:
GregorianCalendar date = (GregorianCalendar) Calendar.getInstance(); InputStream fis = new FileInputStream("cert.der"); AttributeCertificate cert = new AttributeCertificate(fis); fis.close(); RevokedAttributeCertificate revCert = new RevokedAttributeCertificate(cert, date.getTime()); crl.addCertificate(revCert);
revokedCert
- the RevokedCertificate to add to this CRLRevokedCertificate
public java.util.Enumeration listCertificates()
The RevokedCertificate
objects returned by this method may
represent direct (certificate issuer == crl issuer) or indirect CRL entries
(certificate issuer != crl issuer). Indirect entries may (but must not)
contain a CertificateIssuer
extension. A
RevokedCertificate that represents an indirect entry will contain a
CertificateIssuer extension if it is the first entry in the sequence of
entries for the this certificate issuer. It may or may not contain a
CertificateIssuer extension if it is not the first entry in the sequence of
entries for this certificate issuer.
In this way the enumeration returned by this method reflects the order of
entries in an (direct or indirect) crl: it may start with direct entries
which refer to certificates that have been directly issued by the crl
issuer. These entries must not contain a CertificateIssuer extension. Each
sequence of entries that refer to certificates which have NOT been issued
by the crl issuer must start with a RevokedCertificate entry that must
contain a CertificateIssuer extension with the name of the certificate
issuer. The following entries must not contain a CertificateIssuer
extension as long as they have been issued by the same issuer, e.g.:
1. direct entry 2. direct entry ... 10. direct entry 11. indirect entry (with CertificateIssuer extension for CertIssuer 1) 12. indirect entry 13. indirect entry ... 18. indirect entry 19. indirect entry (with CertificateIssuer extension for CertIssuer 2) 20. indirect entry 21. indirect entry ... 24. indirect entry 25. indirect entry (with CertificateIssuer extension for CertIssuer 3) 26. indirect entry 27. indirect entry ... 34. indirect entryEntry 1 to 10 of this example crl are direct entries that refer to certificates that have been issued by the crl issuer. Entry 11 to 18 are indirect entries, all referring to certificates that have been issued by CertIssuer1. Entry 19 to 24 refer to certificates that have been issued by CertIssuer2, entry 25 to 34 refer to certificates that have been issued by CertIssuer3. Only the first entry (11., 19., 25.) for each cert issuer must contain the CertificateIssuer extension, any following entry belongs to the same certificate issuer as the preceding entry.
public boolean removeCertificate(AttributeCertificate cert)
true
if the certificate successfully has been removed
false
otherwisepublic boolean removeCertificate(java.math.BigInteger serialNumber)
crl.removeCertificate(cert.getSerialNumber());
serialNumber
- the serial number of the certificate which should be removedtrue
if the certificate successfully has been removed
false
otherwisepublic void removeAllCertificates()
public void setSignatureAlgorithm(AlgorithmID signatureAlg)
crl.setSignatureAlgorithm(AlgorithmID.sha1WithRSAEncryption);
signatureAlg
- the AlgorithmID of the signature algorithm to be used for signingAlgorithmID
public void setIssuerDN(java.security.Principal issuer) throws java.lang.IllegalArgumentException
Name issuer = new Name(); issuer.addRDN(ObjectID.country, "AT"); issuer.addRDN(ObjectID.organization, "TU Graz"); issuer.addRDN(ObjectID.organizationalUnit, "IAIK"); issuer.addRDN(ObjectID.commonName, "IAIK Test CA"); crl.setIssuerDN(issuer);
issuer
- the distinguished name of the issuer of the CRL; shall be an iaik.asn1.structures.Name
;
if not, the issuer is tried to converted to an iaik.asn1.structures.Name
objectjava.lang.IllegalArgumentException
- if the issuer is not an instance of Name and cannot be
converted to a NamegetIssuerDN(iaik.x509.attr.AttributeCertificate)
public void setThisUpdate(java.util.Date thisUpdate)
thisUpdate
. The thisUpdate
time
value specifies the date on which the CRL has been issued.
For instance, set ThisUpdate
to the current date by writing:
GregorianCalendar date = (GregorianCalendar) Calendar.getInstance(); crl.setThisUpdate(date.getTime());
The X.509 Certificate and CRL Profile specified in RFC 3280 recommends to encode
thisUpdate
dates through the year 2049 as UTCTime, and
thisUpdate
dates in 2050 or later as GeneralizedTime.
thisUpdate
- the date when this CRL has been issuedgetThisUpdate()
public void setNextUpdate(java.util.Date nextUpdate)
nextUpdate
. The nextUpdate
time
value specifies the date on which the next CRL will be issued.
If the next update will be done, for instance, next month, you may write:
GregorianCalendar date = (GregorianCalendar) Calendar.getInstance(); date.add(Calendar.MONTH, 1); crl.setNextUpdate(date.getTime());
The X.509 Certificate and CRL Profile specified in RFC 3280 recommends to encode
nextUpdate
dates through the year 2049 as UTCTime, and
nextUpdate
dates in 2050 or later as GeneralizedTime.
nextUpdate
- when the next CRL will be createdgetNextUpdate()
public byte[] getEncoded() throws java.security.cert.CRLException
getEncoded
in class java.security.cert.X509CRL
java.security.cert.CRLException
- if an encoding error occurspublic int getVersion()
int
. The version
number may specify a v1 or v2 CRL.
ASN.1 definition:
Version ::= INTEGER { v1(0), v2(1), v3(2) } v3 only appears for consistency reasons
getVersion
in class java.security.cert.X509CRL
int
public AlgorithmID getSignatureAlgorithm()
AlgorithmID
public java.security.Principal getIssuerDN()
Principal
. A Distinguished Name is used to specify a
path within a X.500 directory information tree. A distinguished name is
defined as a sequence of relative distinguished names:
Name ::= CHOICE { RDNSequence } RDNSequence ::= SEQUENCE OF RelativeDistinguishedName RelativeDistinguishedName ::= SET OF AttributeTypeAndValue AttributeTypeAndValue ::= SEQUENCE { type AttributeType, value AttributeValue } AttributeType ::= OBJECT IDENTIFIER AttributeValue ::= ANY
CAs conforming to RFC
3280 have to ensure to only issue crls having a non-empty distinguished
name (DN) in their issuer field. Additional identities about the issuer may
be included in the IssuerAltName
extension.
getIssuerDN
in class java.security.cert.X509CRL
Principal
(iaik.asn1.structures.Name
)setIssuerDN(java.security.Principal)
public java.util.Enumeration getIssuerDNs()
public java.util.Date getThisUpdate()
thisUpdate
. The thisUpdate
time value specifies the date on which the CRL has been issued.
ASN.1 definition:
thisUpdate Time Time ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }
The X.509 Certificate and CRL Profile specified in RFC 3280 recommends to encode
thisUpdate
dates through the year 2049 as UTCTime, and
thisUpdate
dates in 2050 or later as GeneralizedTime.
getThisUpdate
in class java.security.cert.X509CRL
setThisUpdate(java.util.Date)
public java.util.Date getNextUpdate()
nextUpdate
. The nextUpdate
time value specifies the date on which the next CRL will be issued.
ASN.1 definition:
nextUpdate Time OPTIONAL Time ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }
The PKIX CRL (RFC 3280)
profile requires the inclusion of the nextUpdate
field in CRLs
issued by conforming CAs, although it is marked as OPTIONAL in the ASN.1
definition above.
The X.509 Certificate and CRL Profile specified in RFC 3280 recommends to encode
nextUpdate
dates through the year 2049 as UTCTime, and
nextUpdate
dates in 2050 or later as GeneralizedTime.
getNextUpdate
in class java.security.cert.X509CRL
setNextUpdate(java.util.Date)
public java.security.cert.X509CRLEntry getRevokedCertificate(java.math.BigInteger serialNumber)
Note that the information returned by this method may be only appropriate
for direct CRL entries (where the crl issuer is equal to the certificate
issuer). Generally you should prefer method
because it is also able to properly
handle indirect crl entries.containsCertificate
getRevokedCertificate
in class java.security.cert.X509CRL
serialNumber
- the serial number to be searched fornull
otherwisepublic java.security.cert.X509CRLEntry getRevokedCertificate(java.security.cert.X509Certificate certificate)
The RevokedCertificate
object returned by this method may
represent an indirect CRL entry (certificate issuer != crl issuer) which
may (but must not) contain a CertificateIssuer
extension. It will contain a CertificateIssuer extension if it is the first
entry in the sequence of entries for the this certificate issuer. It may or
may not contain a CertificateIssuer extension if it is not the first entry
in the sequence of entries for this certificate issuer. However, the
certificate issuerDN is already known when calling this method, thus it is
not necessary to include a CertificateIssuer extension into the
RevokedCertificate.
Remember the order of entries in an indirect crl: it may start with direct
entries which refer to certificates that have been directly issued by the
crl issuer. These entries must not contain a CertificateIssuer extension.
Each sequence of entries that refer to certificates which have NOT been
issued by the crl issuer must start with a RevokedCertificate entry that
must contain a CertificateIssuer extension with the name of the certificate
issuer. The following entries must not contain a CertificateIssuer
extension as long as they have been issued by the same issuer, e.g.:
1. direct entry 2. direct entry ... 10. direct entry 11. indirect entry (with CertificateIssuer extension for CertIssuer 1) 12. indirect entry 13. indirect entry ... 18. indirect entry 19. indirect entry (with CertificateIssuer extension for CertIssuer 2) 20. indirect entry 21. indirect entry ... 24. indirect entry 25. indirect entry (with CertificateIssuer extension for CertIssuer 3) 26. indirect entry 27. indirect entry ... 34. indirect entryEntry 1 to 10 of this example crl are direct entries that refer to certificates that have been issued by the crl issuer. Entry 11 to 18 are indirect entries, all referring to certificates that have been issued by CertIssuer1. Entry 19 to 24 refer to certificates that have been issued by CertIssuer2, entry 25 to 34 refer to certificates that have been issued by CertIssuer3. Only the first entry (11., 19., 25.) for each cert issuer must contain the CertificateIssuer extension, any following entry belongs to the same certificate issuer as the preceding entry.
getRevokedCertificate
in class java.security.cert.X509CRL
cert
- the certificate to checkpublic java.util.Set getRevokedCertificates()
Unlike method
which returns an Enumeration of revocation entries, this method returns a
Set and therefore may not reflect the order of revoked certificates. For
that reason each listCertificates
RevokedCertificate
object that
represents an indirect crl entry must contain a CertificateIssuer
extension with the name of the responsible certificate
issuer. Thus calling this method is more expensive than calling method
.listCertificates
getRevokedCertificates
in class java.security.cert.X509CRL
null
if there are no
certificates revoked by this CRLpublic byte[] getTBSCertList() throws java.security.cert.CRLException
TBSCertList
inherent to this CRL as DER encoded
ASN.1 structure. The TBSCertList
specifies the (distinguished)
name of the issuer, the issue date of the CRL, the date when the next CRL
will be issued, and optionally lists of revoked certificates (identified by
their serial numbers) and CRL extensions. The list of revoked certificates
is classified as being optional, since a CA may not have revoked any issued
certificate when publishing a CRL:
TBSCertList ::= SEQUENCE { version Version OPTIONAL, -- if present, must be v2 signature AlgorithmIdentifier, issuer Name, thisUpdate Time, nextUpdate Time OPTIONAL, revokedCertificates SEQUENCE OF SEQUENCE { userCertificate CertificateSerialNumber, revocationDate Time, crlEntryExtensions Extensions OPTIONAL -- if present, must be v2 } OPTIONAL, crlExtensions [0] EXPLICIT Extensions OPTIONAL -- if present, must be v2 }
where:
Version ::= INTEGER { v1(0), v2(1), v3(2) } -- v3 does not apply to CRLs but appears for consistency -- with definition of Version for certs
AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } -- contains a value of the type -- registered for use with the -- algorithm object identifier value
Name ::= CHOICE { RDNSequence }
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE { type AttributeType, value AttributeValue }
AttributeType ::= OBJECT IDENTIFIER
AttributeValue ::= ANY -- Directory string type --
DirectoryString ::= CHOICE { teletexString TeletexString (SIZE (1..MAX)), printableString PrintableString (SIZE (1..MAX)), universalString UniversalString (SIZE (1..MAX)), utf8String UTF8String (SIZE (1..MAX)), bmpString BMPString (SIZE (1..MAX)) } }
Time ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }
CertificateSerialNumber ::= INTEGER
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE { extnID OBJECT IDENTIFIER, critical BOOLEAN DEFAULT FALSE, extnValue OCTET STRING }
The CRL issuing CA computes the digital signature upon the ASN.1 DER
encoded TBSCertList
structure.
getTBSCertList
in class java.security.cert.X509CRL
TBSCertList
structure inherent to this CRLjava.security.cert.CRLException
- if an error occurs when parsing the CRLpublic byte[] getSignature()
getSignature
in class java.security.cert.X509CRL
public java.lang.String getSigAlgName()
For the RSA-PSS signature algorithm the JCA standard name is derived from the
algorithm id parameters. Since there is only one AlgorithmID
specified for RSA-PSS, hash algorithm and mask generation function are given by
the algorithm id parameters.
The JCA uses the <digest>with<RSA>and<mgf> naming scheme for RSA-PSS
where <digest> and <mgf> have to be got from the algorithm id parameters.
Thus the JCA standard name for, e.g., a RSA-PSS algorithm id
using SHA-256 as hash algorithm and MGF1 as mask generation function is
"SHA256withRSAandMGF1". If the parameters cannot be parsed, "RSASSA-PSS" is
returned as (general) signature algorithm name.
getSigAlgName
in class java.security.cert.X509CRL
public java.lang.String getSigAlgOID()
getSigAlgOID
in class java.security.cert.X509CRL
ObjectID
,
AlgorithmID
public byte[] getSigAlgParams()
getSigAlgParams
in class java.security.cert.X509CRL
null
if there are no parameters usedpublic java.util.Set getCriticalExtensionOIDs()
getCriticalExtensionOIDs
in interface java.security.cert.X509Extension
null
getNonCriticalExtensionOIDs()
public java.util.Set getNonCriticalExtensionOIDs()
getNonCriticalExtensionOIDs
in interface java.security.cert.X509Extension
getCriticalExtensionOIDs()
public byte[] getExtensionValue(java.lang.String oid)
The oid
string is represented by a set of positive whole
numbers separated by periods, e.g. "2.5.29.20" for the
CrlNumber
extension.
In ASN.1, the Extensions
field is defined as a SEQUENCE of
Extension:
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension Extension ::= SEQUENCE { extnID OBJECT IDENTIFIER, critical BOOLEAN DEFAULT FALSE, extnValue OCTET STRING }
where critical
specifies whether an extension has to be
treated as being critical or not; the default value is FALSE. An extension
can be identified by its object identifier, given in the
extnID
field. The value of the extension is represented as
ASN.1 OCTET STRING data structure in the extnValue
field.
The byte value returned by this method represents the DER encoding of the extnValue (OCTET_STRING) from above, and the value of this OCTET STRING represents the DER encoding of the specific extension's ASN.1 representation itself.
Attention: For compatibility reasons to the standard JCA certificate API this method has been changed to return the OCTET STRING value as described above. Prior versions of this class have returned the DER encoding of the specific extension's ASN.1 representation itself.
getExtensionValue
in interface java.security.cert.X509Extension
oid
- the Object Identifier value of the extension to be queried fornull
if it is not presentpublic void addExtension(V3Extension e) throws X509ExtensionException
If an extension with the same object ID already exists, it is replaced.
For instance:
ACRL crl = new ACRL(); ... CRLNumber crl_number = new CRLNumber(BigInteger.valueOf(4234234)); crl.addExtension(crl_number);
For getting some extension use method getExtension(ObjectID)
.
e
- the X509v2 CRL extension to add to the list of extensionsX509ExtensionException
- if an error occurs while DER encoding the extensionV3Extension
public boolean removeExtension(ObjectID oid)
oid
- the object ID of the extension to removetrue
if the extension successfully has been removed
false
otherwisepublic void removeAllExtensions()
public java.util.Enumeration listExtensions()
The returned enumeration may contain unknown extensions (instances
of UnknownExtension
if there are any
extensions included in this certificate, for which there exists no
registered implementation, and it may contain error extensions
(instances of ErrorExtension
)
indicating extensions which cannot be parsed properly because of some kind
of error.
null
if there are
no extensions present at allpublic boolean hasExtensions()
true
if there are extensions, false
if
notpublic boolean hasUnsupportedCriticalExtension()
hasUnsupportedCriticalExtension
in interface java.security.cert.X509Extension
public int countExtensions()
public V3Extension getExtension(ObjectID oid) throws X509ExtensionInitException
If the extension cannot be initialized for some reason, an
X509ExtensionInitException is thrown. If the requested extension is an
unknown extension, which is not supported by a registered
implementation, this method creates and returns an
UnknownExtension
which may be queried
for obtaining as much information as possible about the unknown extension.
oid
- the object ID of the extensionnull
if the requested
extension is not presentX509ExtensionInitException
- if the extension can not be initializedX509Extensions.getExtension(ObjectID)
public byte[] getFingerprint()
public byte[] getFingerprint(java.lang.String digestAlgorithm) throws java.security.NoSuchAlgorithmException
digestAlgorithm
- the digest algorithm to be usedjava.security.NoSuchAlgorithmException
- if the requested algorithm is not supportedpublic byte[] getFingerprintSHA()
public java.lang.String toString()
toString
in class java.security.cert.CRL
public java.lang.String toString(boolean detailed)
detailed
- whether or not to give detailed information about the CRL.