public class UniversalKeyStore
extends java.security.KeyStoreSpi
The universal KeyStore may be used to read a Java KeyStore in the accustomed
way by the JDK KeyStore API but without having the necessity of explicitly specifying
the actual KeyStore type. This might be useful when supporting KeyStores of
arbitrary (pre-defined) type and providers.
By the default the Universal KeyStore supports the KeyStore types "PKCS12"
and "IAIKKeyStore" meaning that the Universal KeyStore first tries the
PKCS12 format when reading a KeyStore and then -- if PKSC12 fails -- tries the
IAIKKeyStore format:
// stream from which to read the (PKCS12 or IAIK)KeyStore InputStream is = ...; // the keystore password char[] pwd = ...; // create the KeyStore KeyStore keyStore = KeyStore.getInstance("Universal", "IAIK"); // load the KeyStore: keyStore.load(is, pwd); // perform any KeyStore operations (like querying for aliases or fetch keys/certificates) EnumerationWhen creating an entire new key store the key store will have the format of the first supported type (PKCS12 by default).aliases = ks.aliases(); ...
If you want to support other or additional key store format than the
default types you must specify them by calling method
before using the KeyStore. To, for instance, reverse the order of
the default KeyStore types (PKCS12, IAIKKeyStore) you may call:
setSupportedKeyStoreTypes
UniversalKeyStore.setSupportedKeyStoreTypes(new KeyStoreType[] { UniversalKeyStore.KS_TYPE_IAIK, UniversalKeyStore.KS_TYPE_PKCS12, new KeyStoreType("JKS", "SUN") });You also may specify/add and use key store types of other than the IAIK provider:
String otherKeyStoreType = ..., String otherProvider = ...; UniversalKeyStore.setSupportedKeyStoreTypes(new KeyStoreType[] { UniversalKeyStore.KS_TYPE_PKCS12, UniversalKeyStore.KS_TYPE_IAIK, new KeyStoreType(otherKeyStoreType, otherProvider) });Note that using the UniversalKeyStore may cause some certain overhead when parsing a KeyStore because it might be necessary to try several formats and because the KeyStore API has to wrapped by the KeyStore SPI. Furthermore -- when failing to parse a KeyStore -- the final error message may not entirely represent the actual reason of the parsing failure. Therefore you should use the UniversalKeyStore only if you are sure about the supported KeyStore formats and if you not have to take care of the actual KeyStore format.
Modifier and Type | Class and Description |
---|---|
static class |
UniversalKeyStore.KeyStoreType
Identifies a KeyStore by its type (e.g.
|
static class |
UniversalKeyStore.PKCS12JKSKeyStore
UniversalKeyStore with "PKCS12" as primary KeyStore type and
"JKS" as secondary (fallback) type to may be used to solve
JSSE default KeyStore parsing problems.
|
Modifier and Type | Field and Description |
---|---|
static UniversalKeyStore.KeyStoreType |
KS_TYPE_IAIK
KeyStore type for the IAIKKeyStore.
|
static UniversalKeyStore.KeyStoreType |
KS_TYPE_PKCS12
KeyStore type for the IAIK PKCS12KeyStore.
|
Constructor and Description |
---|
UniversalKeyStore()
Default constructor.
|
Modifier and Type | Method and Description |
---|---|
java.util.Enumeration |
engineAliases()
Lists all aliases contained in the keystore.
|
boolean |
engineContainsAlias(java.lang.String alias)
Checks if the given alias exists in this keystore.
|
void |
engineDeleteEntry(java.lang.String alias)
Deletes the entry identified by the given alias from the keystore.
|
java.security.cert.Certificate |
engineGetCertificate(java.lang.String alias)
Returns the certificate associated with the given alias.
|
java.lang.String |
engineGetCertificateAlias(java.security.cert.Certificate cert)
Returns the (alias) name of the first keystore entry whose certificate
matches the given certificate.
|
java.security.cert.Certificate[] |
engineGetCertificateChain(java.lang.String alias)
Returns the certificate chain associated with the given alias.
|
java.util.Date |
engineGetCreationDate(java.lang.String alias)
Returns the creation date of the entry identified by the given alias.
|
java.security.Key |
engineGetKey(java.lang.String alias,
char[] password)
Returns the key associated with the given alias, using the given password
to recover it.
|
boolean |
engineIsCertificateEntry(java.lang.String alias)
Returns true if the entry identified by the given alias is a trusted
certificate entry, and false otherwise.
|
boolean |
engineIsKeyEntry(java.lang.String alias)
Returns true if the entry identified by the given alias is a key
entry, and false otherwise.
|
void |
engineLoad(java.io.InputStream stream,
char[] password)
Loads the keystore from the given input stream.
|
void |
engineSetCertificateEntry(java.lang.String alias,
java.security.cert.Certificate cert)
Assigns the given certificate to the given alias.
|
void |
engineSetKeyEntry(java.lang.String alias,
byte[] key,
java.security.cert.Certificate[] chain)
Assigns the given key (that has already been protected) to the given alias.
|
void |
engineSetKeyEntry(java.lang.String alias,
java.security.Key key,
char[] password,
java.security.cert.Certificate[] chain)
Assigns the given key to the given alias, protecting it with the given
password.
|
int |
engineSize()
Retrieves the number of entries in this keystore.
|
void |
engineStore(java.io.OutputStream stream,
char[] password)
Writes this keystore to the given output stream, and protects its integrity
with the specified password.
|
static void |
setSupportedKeyStoreTypes(UniversalKeyStore.KeyStoreType[] keyStoreTypes)
Sets the list of supported KeyStore types.
|
public static final UniversalKeyStore.KeyStoreType KS_TYPE_PKCS12
public static final UniversalKeyStore.KeyStoreType KS_TYPE_IAIK
public static final void setSupportedKeyStoreTypes(UniversalKeyStore.KeyStoreType[] keyStoreTypes)
keyStoreTypes
- the List of supported KeyStore types.public java.security.Key engineGetKey(java.lang.String alias, char[] password) throws java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException
engineGetKey
in class java.security.KeyStoreSpi
alias
- the alias namepassword
- the password for recovering the keyjava.security.NoSuchAlgorithmException
- if the algorithm for recovering the key cannot be foundjava.security.UnrecoverableKeyException
- if the key cannot be recovered (e.g., the given password is
wrong).public java.security.cert.Certificate[] engineGetCertificateChain(java.lang.String alias)
engineGetCertificateChain
in class java.security.KeyStoreSpi
alias
- the alias namepublic java.security.cert.Certificate engineGetCertificate(java.lang.String alias)
If the given alias name identifies a trusted certificate entry, the certificate associated with that entry is returned. If the given alias name identifies a key entry, the first element of the certificate chain is returned, or null if that entry does not have a certificate chain.
engineGetCertificate
in class java.security.KeyStoreSpi
alias
- the alias namepublic java.util.Date engineGetCreationDate(java.lang.String alias)
engineGetCreationDate
in class java.security.KeyStoreSpi
alias
- the alias namepublic void engineSetKeyEntry(java.lang.String alias, java.security.Key key, char[] password, java.security.cert.Certificate[] chain) throws java.security.KeyStoreException
engineSetKeyEntry
in class java.security.KeyStoreSpi
alias
- the alias namekey
- the key to be associated with the aliaspassword
- the password to protect the keychain
- the certificate chain for the corresponding public keyjava.security.KeyStoreException
- if the given key cannot be protected, or this operation fails
for some other reasonpublic void engineSetKeyEntry(java.lang.String alias, byte[] key, java.security.cert.Certificate[] chain) throws java.security.KeyStoreException
engineSetKeyEntry
in class java.security.KeyStoreSpi
alias
- the alias namekey
- the key (in protected format) to be associated with the aliaschain
- the certificate chain for the corresponding public key (only
useful if the protected key is of type
java.security.PrivateKey
).java.security.KeyStoreException
- if this operation fails for some reasonpublic void engineSetCertificateEntry(java.lang.String alias, java.security.cert.Certificate cert) throws java.security.KeyStoreException
engineSetCertificateEntry
in class java.security.KeyStoreSpi
alias
- the alias namecert
- the certificatejava.security.KeyStoreException
- if the given alias already exists and does not identify a
trusted certificate entry, or this operation fails for
some other reason.public void engineDeleteEntry(java.lang.String alias) throws java.security.KeyStoreException
engineDeleteEntry
in class java.security.KeyStoreSpi
alias
- the alias namejava.security.KeyStoreException
- if the entry cannot be removed.public java.util.Enumeration engineAliases()
engineAliases
in class java.security.KeyStoreSpi
public boolean engineContainsAlias(java.lang.String alias)
engineContainsAlias
in class java.security.KeyStoreSpi
alias
- the alias namepublic int engineSize()
engineSize
in class java.security.KeyStoreSpi
public boolean engineIsKeyEntry(java.lang.String alias)
engineIsKeyEntry
in class java.security.KeyStoreSpi
public boolean engineIsCertificateEntry(java.lang.String alias)
engineIsCertificateEntry
in class java.security.KeyStoreSpi
public java.lang.String engineGetCertificateAlias(java.security.cert.Certificate cert)
engineGetCertificateAlias
in class java.security.KeyStoreSpi
cert
- the certificate to match with.public void engineStore(java.io.OutputStream stream, char[] password) throws java.io.IOException, java.security.NoSuchAlgorithmException, java.security.cert.CertificateException
engineStore
in class java.security.KeyStoreSpi
stream
- the output stream to which this keystore is written.password
- the password to generate the keystore integrity checkjava.io.IOException
- if there was an I/O problem with datajava.security.NoSuchAlgorithmException
- if the appropriate data integrity algorithm could not be foundjava.security.cert.CertificateException
- if any of the certificates included in the keystore data could
not be storedpublic void engineLoad(java.io.InputStream stream, char[] password) throws java.io.IOException, java.security.NoSuchAlgorithmException, java.security.cert.CertificateException
If a password is given, it is used to check the integrity of the keystore data. Otherwise, the integrity of the keystore is not checked.
engineLoad
in class java.security.KeyStoreSpi
stream
- the input stream from which the keystore is loadedpassword
- the (optional) password used to check the integrity of the
keystore.java.io.IOException
- if there is an I/O or format problem with the keystore datajava.security.NoSuchAlgorithmException
- if the algorithm used to check the integrity of the keystore
cannot be foundjava.security.cert.CertificateException
- if any of the certificates in the keystore could not be loaded