Java 7无法使用ECC密钥
无论是使用Java 7无法使用ECC密钥,java,cryptography,jce,Java,Cryptography,Jce,无论是使用keytool还是普通Java代码,使用椭圆曲线创建签名在Java1.7.0_85上都不起作用 例如-使用keytool在NIST p-256曲线上生成新的EC键: keytool -v -genkeypair -alias my_key -keyalg EC -keysize 256 -keystore test.jks 引发以下异常: keytool error: java.security.SignatureException: Could not sign data java
keytool
还是普通Java代码,使用椭圆曲线创建签名在Java1.7.0_85
上都不起作用
例如-使用keytool
在NIST p-256曲线上生成新的EC键:
keytool -v -genkeypair -alias my_key -keyalg EC -keysize 256 -keystore test.jks
引发以下异常:
keytool error: java.security.SignatureException: Could not sign data
java.security.SignatureException: Could not sign data
at sun.security.ec.ECDSASignature.engineSign(ECDSASignature.java:297)
at java.security.Signature$Delegate.engineSign(Signature.java:1205)
at java.security.Signature.sign(Signature.java:578)
at sun.security.x509.X509CertImpl.sign(X509CertImpl.java:524)
at sun.security.x509.X509CertImpl.sign(X509CertImpl.java:474)
at sun.security.x509.CertAndKeyGen.getSelfCertificate(CertAndKeyGen.java:269)
at sun.security.tools.KeyTool.doGenKeyPair(KeyTool.java:1558)
at sun.security.tools.KeyTool.doCommands(KeyTool.java:969)
at sun.security.tools.KeyTool.run(KeyTool.java:340)
at sun.security.tools.KeyTool.main(KeyTool.java:333)
Caused by: java.security.KeyException
at sun.security.ec.ECDSASignature.signDigest(Native Method)
at sun.security.ec.ECDSASignature.engineSign(ECDSASignature.java:293)
... 9 more
由于这是一个相当低级的异常,所以无论我想在Java代码中使用EC签名的地方都会抛出相同的异常
我检查了我的java.security
文件是否安装了SunEC
提供程序,但看起来一切正常:
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
而且JAVA_HOME/jre/lib/ext/
也包含sunec.jar
。
另外,US\u export\u policy.jar
和local\u policy.jar
也在JAVA\u HOME/jre/lib/security
文件夹中
你知道原因是什么吗?ECC应该与Java7一起工作
编辑:这里还有生成与使用keytool
相同异常的Java代码-我使用稍微不同的场景-将带有EC p-256密钥的PKCS12证书转换为JKS密钥库。在最后一行调用sign()
方法时引发异常
KeyStore kst = KeyStore.getInstance("JKS");
kst.load(new FileInputStream("kst.jks"), "******".toCharArray());
Key k = kst.getKey("my_key", "******".toCharArray());
Signature sig = Signature.getInstance("SHA256withECDSA");
sig.initSign((PrivateKey)k);
sig.update("test".getBytes());
System.out.println(bytesToHex(sig.sign()));
如果我查看异常,则显然加载并使用了提供程序;它包含sun.security.ec.*类。还有更深层次的例外吗?您是否有生成异常(即签名生成)的代码?虽然我认为它不应该起作用,但您能在
keytool
命令中尝试ecdsa
作为keyalg
吗?@MaartenBodewes我进行了深入挖掘,发现异常源于本机代码-但是关于本机错误代码的任何信息都不会传播到Java级别,所以我得到的只是KeyException
。如果我使用ecdsa
作为keyalg
我得到无法导出签名算法
异常。你能打印出k.getClass().getName()
?@MaartenBodewes:sun.security.ec.ECPrivateKeyImpl
。我发现整个问题似乎只与OpenJDK(7和8)有关——当我使用Oracle JRE 8时,ECC工作正常。嗯,在这种情况下听起来像个bug。。。