我创建了新的 JKS keystore ,其中包含 trustedCertEntry 和 PrivateKeyEntry。两者均使用 ECC(签名算法名称:SHA384withECDSA)创建。导入只能使用支持 ECC 的 Java 1.7 keytool 完成。在运行时,我使用不支持 ECC 的 java 1.6。
在我的代码中我定义了:
System.setProperty("javax.net.ssl.keyStore", "c:\mykey.ks");
System.setProperty("javax.net.ssl.keyStorePassword","abcde");
目前我得到:
org.apache.axis2.AxisFault:无法解码 base64 数据:null
有没有在 Java 1.6 中使用 JKS 的方法?
最佳答案
基本上,要使 ECC 在 Java 6 中可用,您必须做的是添加一个额外的支持 ECC 的提供程序。如果不付钱,您有两种选择:
- Sun PKCS#11 提供商
- Bouncy Castle提供者
对于选项 1,您需要一个 native PKCS#11 库,我假设您没有。无论如何,选项 2 可能是更好的选择,因为 PKCS#11 实际上用于智能卡或 HSM 中的 key 。但是,如果有人想这样做,这里只是为了记录,这里是如何做的描述(NSS 部分无关紧要):How to export ECC key and Cert from NSS DB and import into JKS keystore and Oracle Wallet
选项 2 要求 keystore 属于 Bouncy CaSTLe(BKS 或 UBER)提供的类型之一,并且需要安装 Bouncy CaSTLe 提供程序。
对于提供程序安装,请遵循以下说明:Provider Installation .可能需要在标准 SSL 提供程序 (com.sun.net.ssl.internal.ssl.Provider) 之前添加 BC 提供程序,但我对此不确定。
之后,您可以使用之前使用过的 keytool 命令将 key 导入 BKS keystore ,并进行以下修改:
-storetype BKS
代替-storetype JKS
-providerclass org.bouncycaSTLe.jce.provider.BouncyCaSTLeProvider
或者您可以使用 KeyStore Explorer用于将 keystore 从 JKS 转换为 BKS(如果您使用 Java 7 运行 KSE)。
要将 BKS keystore 用于 SSL,您必须添加另一个系统属性:
System.setProperty("javax.net.ssl.keyStoreType", "BKS");
应该是这样,但坦率地说,我建议切换到 Java 7 或 RSA key 。
关于java - 如何在 Java 1.6 中使用 ECC 私钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27677037/