使用 nimbus-jose 和 Java 6 的 ECDH + JWE 加密
ECDH + JWE encryption using nimbus-jose and Java 6
我有一个问题,我想知道你是否可以帮助我。
我需要创建一个带椭圆曲线的加密 JWE。
我正在使用
jre 1.6.0,nimbus-jose-jwt-8.20-jdk6.jar,bcprov-jdk15to18-166.jar。
我已经使用 EC 算法和椭圆曲线 P-512 创建了一个密钥库和一个密钥对。如果我使用私钥对 JWT 进行签名,然后尝试使用 public 密钥对其进行验证,一切正常,但除了签名之外,我还需要加密以创建一个看不到有效负载的 JWE。
当尝试使用 public 密钥加密 JWE 时,它抛出以下异常
Exception in thread "main" java.lang.NoClassDefFoundError: java/util/Objects
at com.nimbusds.jose.jwk.KeyUse.hashCode(KeyUse.java:121)
at java.util.HashMap.put(Unknown Source)
at com.nimbusds.jose.jwk.KeyUseAndOpsConsistency.<clinit>(KeyUseAndOpsConsistency.java:43)
at com.nimbusds.jose.jwk.JWK.<init>(JWK.java:197)
at com.nimbusds.jose.jwk.ECKey.<init>(ECKey.java:706)
at com.nimbusds.jose.jwk.ECKey$Builder.build(ECKey.java:571)
at com.nimbusds.jose.crypto.ECDHEncrypter.encrypt(ECDHEncrypter.java:217)
at com.nimbusds.jose.JWEObject.encrypt(JWEObject.java:370)
at pruebasJwt.inicioJwt.main(inicioJwt.java:373)
这是我用来加密的代码:
//encriptar token
ECPublicKey publicKey = (ECPublicKey) certificadoBean.getPublicKey();
Payload payload = new Payload(signedJWT2);
JWEObject jwe = new JWEObject(jweHeader, payload);
jwe.encrypt(new ECDHEncrypter(publicKey)); //**This is where the exception occurs**
String jweString = jwe.serialize();
String tokenJwt = signedJWT2.serialize();
System.err.println(tokenJwt);
我在 eclipe class路径中定义了库。
虽然我的要求是用椭圆曲线加密的 JWE,但我已经创建了一个测试证书 RSA,这样我就能够毫无问题地生成一个带有所述证书的加密 JWE。
我还使用了他们放在 https://connect2id.com/products/nimbus-jose-jwt/examples/jws-with-ec-signature 页面上的一个非常简单的示例,但它对我也不起作用。创建密钥对时出现相同的异常。
public class JweEC {
public static void main(String[] args) {
System.out.println("############ INICIO JWE FIRMADO CON CERTIFICADO CURVA ELIPTICA ##############");
System.out.println("soporta ES512" + JCASupport.isSupported(JWSAlgorithm.ES512));
//Proveedor de criptografica
Provider bc = BouncyCastleProviderSingleton.getInstance();
Security.addProvider(bc);
System.out.println("soporta ES512" + JCASupport.isSupported(JWSAlgorithm.ES512));
try {
ECKey ecJWK = new ECKeyGenerator(Curve.P_521)
.generate(); **This is where the exception occurs**
ECKey ecPublicJWK = ecJWK.toPublicJWK();
}catch (Exception e) {
// TODO: handle exception
}
}
}
NoClassDefFoundError 异常表示负责动态 class 加载的 class 加载程序找不到您尝试使用的 class 的 .class 文件,但是正如我之前所说,我所有的库都很好地包含在 class 路径中。
会不会是我遗漏了一些利比里亚?我不知道,我迷失了这个问题
问题是 nimbus-jose-jwt-8.20-jdk6.jar 不支持 Java 6 上的 运行,尽管 'jdk6' 在其名字.
您看到的错误是因为 KeyUse class uses a method in the java.util.Objects
实用程序 class 的 hashCode()
方法,而此 class 只能从 Java 7起。
我 强烈 建议至少从 Java 6 升级到 Java 8。这样做肯定会解决这个问题。但是,如果您受困于 Java 6,则必须 get in contact with Connect2Id 并寻求他们的支持。
我收到了 connect2id 的回复,告诉我这是一个问题,正如 Luke 所说,有些东西用 Java 7 编码,这个案例就是其中之一。
最后尝试使用 nimbus-jose-jwt-6.8-jdk6.jar 的其他版本,最终一切如我所愿。
我有一个问题,我想知道你是否可以帮助我。
我需要创建一个带椭圆曲线的加密 JWE。
我正在使用
jre 1.6.0,nimbus-jose-jwt-8.20-jdk6.jar,bcprov-jdk15to18-166.jar。
我已经使用 EC 算法和椭圆曲线 P-512 创建了一个密钥库和一个密钥对。如果我使用私钥对 JWT 进行签名,然后尝试使用 public 密钥对其进行验证,一切正常,但除了签名之外,我还需要加密以创建一个看不到有效负载的 JWE。
当尝试使用 public 密钥加密 JWE 时,它抛出以下异常
Exception in thread "main" java.lang.NoClassDefFoundError: java/util/Objects
at com.nimbusds.jose.jwk.KeyUse.hashCode(KeyUse.java:121)
at java.util.HashMap.put(Unknown Source)
at com.nimbusds.jose.jwk.KeyUseAndOpsConsistency.<clinit>(KeyUseAndOpsConsistency.java:43)
at com.nimbusds.jose.jwk.JWK.<init>(JWK.java:197)
at com.nimbusds.jose.jwk.ECKey.<init>(ECKey.java:706)
at com.nimbusds.jose.jwk.ECKey$Builder.build(ECKey.java:571)
at com.nimbusds.jose.crypto.ECDHEncrypter.encrypt(ECDHEncrypter.java:217)
at com.nimbusds.jose.JWEObject.encrypt(JWEObject.java:370)
at pruebasJwt.inicioJwt.main(inicioJwt.java:373)
这是我用来加密的代码:
//encriptar token
ECPublicKey publicKey = (ECPublicKey) certificadoBean.getPublicKey();
Payload payload = new Payload(signedJWT2);
JWEObject jwe = new JWEObject(jweHeader, payload);
jwe.encrypt(new ECDHEncrypter(publicKey)); //**This is where the exception occurs**
String jweString = jwe.serialize();
String tokenJwt = signedJWT2.serialize();
System.err.println(tokenJwt);
我在 eclipe class路径中定义了库。
虽然我的要求是用椭圆曲线加密的 JWE,但我已经创建了一个测试证书 RSA,这样我就能够毫无问题地生成一个带有所述证书的加密 JWE。
我还使用了他们放在 https://connect2id.com/products/nimbus-jose-jwt/examples/jws-with-ec-signature 页面上的一个非常简单的示例,但它对我也不起作用。创建密钥对时出现相同的异常。
public class JweEC {
public static void main(String[] args) {
System.out.println("############ INICIO JWE FIRMADO CON CERTIFICADO CURVA ELIPTICA ##############");
System.out.println("soporta ES512" + JCASupport.isSupported(JWSAlgorithm.ES512));
//Proveedor de criptografica
Provider bc = BouncyCastleProviderSingleton.getInstance();
Security.addProvider(bc);
System.out.println("soporta ES512" + JCASupport.isSupported(JWSAlgorithm.ES512));
try {
ECKey ecJWK = new ECKeyGenerator(Curve.P_521)
.generate(); **This is where the exception occurs**
ECKey ecPublicJWK = ecJWK.toPublicJWK();
}catch (Exception e) {
// TODO: handle exception
}
}
}
NoClassDefFoundError 异常表示负责动态 class 加载的 class 加载程序找不到您尝试使用的 class 的 .class 文件,但是正如我之前所说,我所有的库都很好地包含在 class 路径中。
会不会是我遗漏了一些利比里亚?我不知道,我迷失了这个问题
问题是 nimbus-jose-jwt-8.20-jdk6.jar 不支持 Java 6 上的 运行,尽管 'jdk6' 在其名字.
您看到的错误是因为 KeyUse class uses a method in the java.util.Objects
实用程序 class 的 hashCode()
方法,而此 class 只能从 Java 7起。
我 强烈 建议至少从 Java 6 升级到 Java 8。这样做肯定会解决这个问题。但是,如果您受困于 Java 6,则必须 get in contact with Connect2Id 并寻求他们的支持。
我收到了 connect2id 的回复,告诉我这是一个问题,正如 Luke 所说,有些东西用 Java 7 编码,这个案例就是其中之一。 最后尝试使用 nimbus-jose-jwt-6.8-jdk6.jar 的其他版本,最终一切如我所愿。