【发布时间】:2022-01-19 16:09:06
【问题描述】:
运行我的 keycloak 应用程序时,出现以下错误:
java.security.NoSuchAlgorithmException: ECDSA KeyFactory not available
at java.base/java.security.KeyFactory.<init>(KeyFactory.java:138) ~[na:na]
at java.base/java.security.KeyFactory.getInstance(KeyFactory.java:183) ~[na:na]
at org.keycloak.jose.jwk.JWKParser.createECPublicKey(JWKParser.java:107) ~[keycloak-core-15.0.2.jar:15.0.2]
... 61 common frames omitted
经过一番挖掘,发现KeyFactory无法将“ECDSA”作为算法解决,因此我应该使用“EC”算法来生成公钥。
但是如果 KeyFactory 不支持“ECDSA”作为算法,为什么 Keycloak-15.0.2 JWKParser 类的 createECPublicKey func 仍然尝试使用 ECDSA 生成公钥?
try {
ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec(name);
ECNamedCurveSpec params = new ECNamedCurveSpec("prime256v1", spec.getCurve(), spec.getG(), spec.getN());
ECPoint point = new ECPoint(x, y);
ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(point, params);
KeyFactory kf = KeyFactory.getInstance("ECDSA");
return kf.generatePublic(pubKeySpec);
} catch (Exception e) {
throw new RuntimeException(e);
}
这是一个错误吗?还是我完全错过了什么?
【问题讨论】:
-
您使用什么 Java 运行时(确切版本、分发器和操作系统)?众所周知,Linux 上较旧的 OpenJDK 版本(例如 OpenJDK 8)存在 ECDSA 问题。
-
我使用的是 openJDK 11.0.3
标签: java security oauth-2.0 keycloak java.security