Не удается получить ключ из KeyStore
Я пытаюсь получить ключ из хранилища ключей. Я создал хранилище ключей с помощью Keytool:
keytool-genkeypair-dname "cn=Марк Джонс, ou=JavaSoft, o=Sun, c=US" - псевдоним business2-keypass abcdtest-хранилище ключей C:workspaceXMLSamplekeystoremykeystore - ... jks-storepass 123456
и следующее-GenerateXML.java
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.X509Certificate;
import javax.xml.crypto.dsig.XMLSignContext;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class GenerateXML {
public static void main(String[] args) throws Exception {
try {
char[] passwd = "123456".toCharArray();
//Load the KeyStore and get the signing key and certificate
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("C:workspaceXMLSamplekeystoremykeystore.jks"), passwd);
KeyStore.PrivateKeyEntry keyEnt = (KeyStore.PrivateKeyEntry)ks.getEntry("business2", new KeyStore.PasswordProtection(passwd)); // -> ERROR IN THIS ROW
X509Certificate cert = (X509Certificate)keyEnt.getCertificate();
//Create a DOMSignContext
XMLSignContext context = new DOMSignContext(keyEnt.getPrivateKey(), doc.getDocumentElement()) ;
//Create a DOM XMLSignatureFactory
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
} catch(Exception e) {
e.printStackTrace();
throw new Exception(e.toString());
}
}
}
Я работаю на Java 1.6
но есть ошибки:
java.security.UnrecoverableKeyException: Cannot recover key
at sun.security.provider.KeyProtector.recover(KeyProtector.java:311)
at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:121)
at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:38)
at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:456)
at java.security.KeyStore.getEntry(KeyStore.java:1261)
at xml.generate.GenerateXML.main(GenerateXML.java:31)
3 ответов
Это означает 2 вещи,
- у вас был плохой пароль.
- ваше хранилище ключей каким-то образом повреждено.
Я подозреваю, что это #1. Дважды проверьте пароль. Попробуйте, если вы можете перечислить ключ в keytool с тем же паролем.
Я запустил аналогичную проблему. Корень проблемы в том, что я использовал другой пароль для ключа, чем для всего хранилища ключей. Код аналогичен тому, что в статье JSSE. Выглядит это так:
serverKeyStore.load(new FileInputStream("resource/server.jks"), passphrase.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(serverKeyStore);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(serverKeyStore, keyphrase.toCharArray());
Я использую пропуск хранилища ключей в первой строке и пропуск ключа в последней.
в ks.getEntry line, вы даете ему пароль магазина. Вместо этого должен быть ключевой пароль. Замените строку этим, и она будет работать:
char[] keypwd = "abcdtest".toCharArray();
KeyStore.PrivateKeyEntry keyEnt = (KeyStore.PrivateKeyEntry) ks.getEntry("business2", new KeyStore.PasswordProtection(keypwd));