我创建了新的JKS密钥库,其中包含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
无论如何,可以将JKS与Java 1.6一起使用吗?
最佳答案
基本上,要使ECC在Java 6中可用,要做的就是添加一个支持ECC的附加提供程序。不付钱,您有两种选择:
Sun PKCS#11提供程序
Bouncy Castle提供程序
对于选项1,您需要一个本机PKCS#11库,我认为您没有。无论如何,选项2可能是更好的选择,因为PKCS#11实际上用于智能卡或HSM中的密钥。但是,仅出于记录目的,如果有人想这样做,以下是有关操作方法的说明(NSS部分无关紧要):How to export ECC key and Cert from NSS DB and import into JKS keystore and Oracle Wallet
选项2要求密钥库是Bouncy Castle提供的类型之一(BKS或UBER),并且需要安装Bouncy Castle提供程序。
对于提供程序安装,请遵循以下指示信息:Provider Installation。可能有必要在标准SSL提供程序(com.sun.net.ssl.internal.ssl.Provider)之前添加BC提供程序,但是我不确定。
之后,可以使用之前使用过的keytool命令将密钥导入到BKS密钥库中,并进行以下修改:-storetype BKS
代替-storetype JKS
-providerclass org.bouncycastle.jce.provider.BouncyCastleProvider
或者,您可以使用KeyStore Explorer将密钥库从JKS转换为BKS(如果您使用Java 7运行KSE)。
要将BKS密钥库用于SSL,您必须添加另一个系统属性:
System.setProperty("javax.net.ssl.keyStoreType", "BKS");
应该是这样,但坦率地说,我建议您切换到Java 7或RSA密钥。
关于java - 如何在Java 1.6中使用ECC私钥?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27677037/