user220668
user220668

Reputation:

Sun Java KeyManagerFactory and null passwords

We are having a problem with the KeyManagerFactory in the Sun JRE 1.6. We are using code similar to the following to upload and use a certificate in p12 format:

KeyStore keyStore = KeyStore.getInstance(PKCS12);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(SUN_X509);

InputStream certificateFile = getSSLCertificate();
String certificatePassword = getSSLCertificatePassword();
keyStore.load(certificateFile, certificatePassword);
keyManagerFactory.init(keyStore, certificatePassword);

This code works correctly when the certificate password exists. But when the certificate password is null (so the certificate is not protected by a password) we get a divide by zero error from the keyManagerFactory.init line.

Does anyone know why this is happening? Is it not possible to use a certificate without a password? Thanks

Upvotes: 7

Views: 5474

Answers (3)

Christopher Schultz
Christopher Schultz

Reputation: 20862

It appears that using an empty character array will configure the KeyManagerFactory to allow access to the keys without a password.

There are all kinds of reasons to have a KeyStore without a password (in-memory-only KeyStores being one possibility).

String keystorePassword = ...;
KeyStore keys = ...;

char[] kpwd;
if(null != keystorePassword && 0 != keystorePassword.length())
    kpwd = keystorePassword.toCharArray();
else
    kpwd = new char[0];

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

kmf.init(keys, kpwd);

KeyManagers managers = kmf.getKeyManagers();

// Now, use "managers" for great things

Upvotes: 1

Elin
Elin

Reputation: 41

This is a bug:

https://bugs.java.com/bugdatabase/view_bug?bug_id=6415637

Workaround is to set a password.

Upvotes: 4

ZZ Coder
ZZ Coder

Reputation: 75486

Because PKCS12 contains private key, you should always have a password. I think Sun accidentally enforces this :)

For all Keystore API, password is required for the store and private keys. If you don't really want deal with the configuration or user-interaction, just use the default password "changeit" everywhere.

Upvotes: 3

Related Questions