无法识别 Wildfly 10 BouncyCastleCrypto ECDSA 密钥规范
Wildfly 10 BouncyCastleCrypto ECDSA key spec not recognized
我正在将对 FIDO U2F 的支持添加到我的 J2EE 应用程序(它基本上是使用硬件令牌保护登录)。我正在使用来自 yubico 的库 u2flib-server-core,它使用 BouncyCastleCrypto 处理协议中的加密操作。然而,在从持久存储中解码 public 密钥时,我不断收到消息
的异常
"key spec not recognized"
我已将问题缩小到库中的这个函数
public PublicKey decodePublicKey(byte[] encodedPublicKey) throws U2fBadInputException {
try {
X9ECParameters curve = SECNamedCurves.getByName("secp256r1");
ECPoint point;
try {
point = curve.getCurve().decodePoint(encodedPublicKey);
} catch (RuntimeException e) {
throw new U2fBadInputException("Could not parse user public key", e);
}
return KeyFactory.getInstance("ECDSA").generatePublic(
new ECPublicKeySpec(point,
new ECParameterSpec(
curve.getCurve(),
curve.getG(),
curve.getN(),
curve.getH()
)
)
);
} catch (GeneralSecurityException e) { //This should not happen
throw new RuntimeException(e);
}
}
方法 generatePublic 抛出异常,该异常被捕获并作为 RuntimeException 重新抛出。
我已经验证了来自 BC 提供商的 KeyFactory.getInstance returns KeyFactory。 运行 Wildfly 之外的这段代码可以完美运行。 (我不得不将 bcprov-ext-jdk15on-154.jar 放入 java 的 /lib/ext 中)。
我已经尝试更新 wildfly 的 bouncycastle 模块,目前我已经添加了在 http://www.bouncycastle.org/latest_releases.html
上发布的所有 6 个 jar
堆栈跟踪中有趣的部分是
java.security.spec.InvalidKeySpecException: key spec not recognised
at org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(Unknown Source)
at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi.engineGeneratePublic(Unknown Source)
at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
at com.yubico.u2f.crypto.BouncyCastleCrypto.decodePublicKey(BouncyCastleCrypto.java:60)
at com.yubico.u2f.data.messages.key.RawAuthenticateResponse.checkSignature(RawAuthenticateResponse.java:64)
at com.yubico.u2f.U2fPrimitives.finishAuthentication(U2fPrimitives.java:153)
at com.yubico.u2f.U2F.finishAuthentication(U2F.java:116)
at com.yubico.u2f.U2F.finishAuthentication(U2F.java:90)
希望有人能帮助我 :-) 提前致谢
编辑: 我已经在其他模式下尝试过该代码,看起来没有识别出单个事件。使用 EC 例外是不同的,因为它使用其他提供程序,但是配置 BC 位于顶部的提供程序列表仍然会出现与我提到的相同的异常。
编辑 我认为这可能是某种类加载问题,所以我打开了详细日志记录,这里是有趣的日志
[Loaded org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi$ECDSA from file:/home/martin/java/jdk1.8.0_45/jre/lib/ext/bcprov-jdk15on-154.jar]
[Loaded org.bouncycastle.jce.spec.ECKeySpec from jar:file:/opt/wildfly-10.0.0.Final/modules/system/layers/base/org/bouncycastle/main/bcprov-jdk15on-1.52.jar!/]
KeyFactorySpi 和 ECKeySpec 来自两个不同的 jar(类加载器?)因此 KeyFactory 中使用的 instanceof 失败
终于找到问题了:-)
当我打开类加载器的详细日志记录时,我发现 KeySpec 来自不同的类加载器,如 KeyFactorySpi,它检查了该 KeySpec 的实例。这是我在解决这个问题时造成的问题。由于 wildfly 10 随附有 RestEasy 所依赖的 BouncyCastle 模块,因此它会被加载。我使用过的 Hover 库也提供了一些 BouncyCastle 类.
我所要做的就是使用以下内容创建 jboss-deployment-structure.xml
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
<deployment>
<dependencies>
<module name="org.bouncycastle" />
</dependencies>
</deployment>
</jboss-deployment-structure>
这让我可以使用 wildfly 的 BouncyCastle 模块。 Hovewer,当我完成此操作时,我已经尝试将 BouncyCastle 放入我用于 运行 服务器的 JRE 的 lib/ext/ 中。这导致了与另一个原因完全相同的错误:-)
综上所述,在将 BouncyCastle 与 wildfly 10 一起使用时,您必须确保以下几点:
- 创建 jboss-deployment-structure.xml 并依赖于 Wildfly 的模块}或者,您可以使用 MANIFEST.mf 来执行此操作|
- 确保您在使用的 JRE 的 lib/ext/ 中没有 BouncyCastle 提供程序
- 如果您动态添加 BouncyCastle JCE 提供程序,您还必须使用 JCE Unlimited 策略文件(当然,如果您合法的话)
希望这对以后的人有帮助 :-)
我正在将对 FIDO U2F 的支持添加到我的 J2EE 应用程序(它基本上是使用硬件令牌保护登录)。我正在使用来自 yubico 的库 u2flib-server-core,它使用 BouncyCastleCrypto 处理协议中的加密操作。然而,在从持久存储中解码 public 密钥时,我不断收到消息
的异常"key spec not recognized"
我已将问题缩小到库中的这个函数
public PublicKey decodePublicKey(byte[] encodedPublicKey) throws U2fBadInputException {
try {
X9ECParameters curve = SECNamedCurves.getByName("secp256r1");
ECPoint point;
try {
point = curve.getCurve().decodePoint(encodedPublicKey);
} catch (RuntimeException e) {
throw new U2fBadInputException("Could not parse user public key", e);
}
return KeyFactory.getInstance("ECDSA").generatePublic(
new ECPublicKeySpec(point,
new ECParameterSpec(
curve.getCurve(),
curve.getG(),
curve.getN(),
curve.getH()
)
)
);
} catch (GeneralSecurityException e) { //This should not happen
throw new RuntimeException(e);
}
}
方法 generatePublic 抛出异常,该异常被捕获并作为 RuntimeException 重新抛出。
我已经验证了来自 BC 提供商的 KeyFactory.getInstance returns KeyFactory。 运行 Wildfly 之外的这段代码可以完美运行。 (我不得不将 bcprov-ext-jdk15on-154.jar 放入 java 的 /lib/ext 中)。
我已经尝试更新 wildfly 的 bouncycastle 模块,目前我已经添加了在 http://www.bouncycastle.org/latest_releases.html
上发布的所有 6 个 jar堆栈跟踪中有趣的部分是
java.security.spec.InvalidKeySpecException: key spec not recognised
at org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(Unknown Source)
at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi.engineGeneratePublic(Unknown Source)
at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
at com.yubico.u2f.crypto.BouncyCastleCrypto.decodePublicKey(BouncyCastleCrypto.java:60)
at com.yubico.u2f.data.messages.key.RawAuthenticateResponse.checkSignature(RawAuthenticateResponse.java:64)
at com.yubico.u2f.U2fPrimitives.finishAuthentication(U2fPrimitives.java:153)
at com.yubico.u2f.U2F.finishAuthentication(U2F.java:116)
at com.yubico.u2f.U2F.finishAuthentication(U2F.java:90)
希望有人能帮助我 :-) 提前致谢
编辑: 我已经在其他模式下尝试过该代码,看起来没有识别出单个事件。使用 EC 例外是不同的,因为它使用其他提供程序,但是配置 BC 位于顶部的提供程序列表仍然会出现与我提到的相同的异常。
编辑 我认为这可能是某种类加载问题,所以我打开了详细日志记录,这里是有趣的日志
[Loaded org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi$ECDSA from file:/home/martin/java/jdk1.8.0_45/jre/lib/ext/bcprov-jdk15on-154.jar]
[Loaded org.bouncycastle.jce.spec.ECKeySpec from jar:file:/opt/wildfly-10.0.0.Final/modules/system/layers/base/org/bouncycastle/main/bcprov-jdk15on-1.52.jar!/]
KeyFactorySpi 和 ECKeySpec 来自两个不同的 jar(类加载器?)因此 KeyFactory 中使用的 instanceof 失败
终于找到问题了:-)
当我打开类加载器的详细日志记录时,我发现 KeySpec 来自不同的类加载器,如 KeyFactorySpi,它检查了该 KeySpec 的实例。这是我在解决这个问题时造成的问题。由于 wildfly 10 随附有 RestEasy 所依赖的 BouncyCastle 模块,因此它会被加载。我使用过的 Hover 库也提供了一些 BouncyCastle 类.
我所要做的就是使用以下内容创建 jboss-deployment-structure.xml
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
<deployment>
<dependencies>
<module name="org.bouncycastle" />
</dependencies>
</deployment>
</jboss-deployment-structure>
这让我可以使用 wildfly 的 BouncyCastle 模块。 Hovewer,当我完成此操作时,我已经尝试将 BouncyCastle 放入我用于 运行 服务器的 JRE 的 lib/ext/ 中。这导致了与另一个原因完全相同的错误:-)
综上所述,在将 BouncyCastle 与 wildfly 10 一起使用时,您必须确保以下几点:
- 创建 jboss-deployment-structure.xml 并依赖于 Wildfly 的模块}或者,您可以使用 MANIFEST.mf 来执行此操作|
- 确保您在使用的 JRE 的 lib/ext/ 中没有 BouncyCastle 提供程序
- 如果您动态添加 BouncyCastle JCE 提供程序,您还必须使用 JCE Unlimited 策略文件(当然,如果您合法的话)
希望这对以后的人有帮助 :-)