KeyStoreからキーを取得しようとしました。 Keytoolでキーストアを作成しました。
keytool -genkeypair -dname "cn = Mark Jones、ou = JavaSoft、o = Sun、c = US" -alias business2 -keypass abcdtest -keystore C:\ workspace\XMLSample\keystore\mykeystore.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:\\workspace\\XMLSample\\keystore\\mykeystore.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)
これは基本的に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行では、ストアパスワードを指定しています。代わりにキーパスワードにする必要があります。行をこれに置き換えて、それは動作します:
char[] keypwd = "abcdtest".toCharArray();
KeyStore.PrivateKeyEntry keyEnt = (KeyStore.PrivateKeyEntry) ks.getEntry("business2", new KeyStore.PasswordProtection(keypwd));