Support for keystores that don't use the keystore.builder's callbacks (looking at you, Java 8 PKCS12\!)
parent
baba4df3a9
commit
32258361a3
|
@ -230,7 +230,34 @@ public class ECDSASignature extends GlobalCryptoSetup implements DigitalSignatur
|
||||||
try {
|
try {
|
||||||
Certificate cert = keyStore.getCertificate(alias);
|
Certificate cert = keyStore.getCertificate(alias);
|
||||||
logger.trace("keystore entry {}, has cert type {}", alias, cert.getClass());
|
logger.trace("keystore entry {}, has cert type {}", alias, cert.getClass());
|
||||||
Key key = keyStore.getKey(alias, null);
|
Key key;
|
||||||
|
try {
|
||||||
|
key = keyStore.getKey(alias, null);
|
||||||
|
} catch (UnrecoverableKeyException e) {
|
||||||
|
// This might be a keystore that doesn't support callback handlers
|
||||||
|
// (e.g., Java 8 PKCS12)
|
||||||
|
// Manually extract password using callback handler
|
||||||
|
char[] password = null;
|
||||||
|
KeyStore.ProtectionParameter prot = keyStoreBuilder.getProtectionParameter(alias);
|
||||||
|
|
||||||
|
if (prot instanceof KeyStore.PasswordProtection) {
|
||||||
|
password = ((KeyStore.PasswordProtection) prot).getPassword();
|
||||||
|
} else if (prot instanceof KeyStore.CallbackHandlerProtection) {
|
||||||
|
PasswordCallback callback = new PasswordCallback("Password for " + alias + "?", false);
|
||||||
|
Callback[] callbacks = { callback };
|
||||||
|
try {
|
||||||
|
((KeyStore.CallbackHandlerProtection) prot).getCallbackHandler().handle(callbacks);
|
||||||
|
password = callback.getPassword();
|
||||||
|
} catch (UnsupportedCallbackException e1) {
|
||||||
|
logger.error("PasswordCallback fallback not supported!", e1);
|
||||||
|
throw new UnrecoverableKeyException("Couldn't use password callback to get key");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.error("Unrecognized protection handler for keystore: {}", prot.getClass());
|
||||||
|
throw new UnrecoverableKeyException("Unrecognized protection handler for keystore");
|
||||||
|
}
|
||||||
|
key = keyStore.getKey(alias, password);
|
||||||
|
}
|
||||||
logger.trace("keystore entry {}, has key type {}", alias, key.getClass());
|
logger.trace("keystore entry {}, has key type {}", alias, key.getClass());
|
||||||
if (key instanceof PrivateKey) {
|
if (key instanceof PrivateKey) {
|
||||||
loadedSigningKeyId = computeCertificateFingerprint(cert);
|
loadedSigningKeyId = computeCertificateFingerprint(cert);
|
||||||
|
|
Loading…
Reference in New Issue