【问题标题】:Can not get key from KeyStore无法从 KeyStore 获取密钥
【发布时间】:2010-11-22 05:39:09
【问题描述】:

我尝试从 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)

【问题讨论】:

    标签: java ws-security


    【解决方案1】:

    这基本上意味着两件事,

    1. 您的密码错误。
    2. 您的密钥库以某种方式损坏。

    我怀疑它是#1。仔细检查您的密码。试试能不能用相同的密码列出keytool中的key。

    【讨论】:

    • 我也有同样的问题。我正在提供密钥库密码,但它说:“受信任的证书条目不受密码保护”。如果我没有提供密码,它会显示:“java.security.KeyStore$TrustedCertificateEntry 与 java.security.KeyStore$PrivateKeyEntry 不兼容”
    • 您好 Coder,我在下面的链接中提到了一个问题。请给我一个解决方案。 stackoverflow.com/questions/33369965/…
    【解决方案2】:

    在 ks.getEntry 行中,您为其提供了商店密码。应该是密钥密码。用这个替换该行,它将起作用:

    char[] keypwd = "abcdtest".toCharArray();
    KeyStore.PrivateKeyEntry keyEnt = (KeyStore.PrivateKeyEntry) ks.getEntry("business2", new KeyStore.PasswordProtection(keypwd));   
    

    【讨论】:

    • 我也有同样的问题。我正在提供密钥库密码,但它说:“受信任的证书条目不受密码保护”。如果我没有提供密码,它会显示:“java.security.KeyStore$TrustedCertificateEntry 与 java.security.KeyStore$PrivateKeyEntry 不兼容”
    【解决方案3】:

    我遇到过类似的问题。问题的根源是我为密钥使用了与整个密钥库不同的密码。 该代码类似于 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());
    

    我在第一行使用密钥库传递,在最后一行使用密钥传递。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多