Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 7无法使用ECC密钥_Java_Cryptography_Jce - Fatal编程技术网

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代码,使用椭圆曲线创建签名在Java
1.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。。。