Wildfly 10 BouncyCastleCrypto ECDSA关键规格无法识别

Mar*_*vňa 4 java bouncycastle java-ee wildfly fido-u2f

我正在向我的J2EE应用程序添加对FIDO U2F的支持(这基本上是用硬件令牌保护登录).我正在使用来自yubico的库,u2flib-server-core,它使用BouncyCastleCrypto处理协议中的加密操作.Hovewer,在从持久存储解码公钥时,我不断收到消息异常

"关键规格未被承认"

我已经从库中缩小了这个功能的问题

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

方法generatePublic抛出异常,它被捕获并重新抛出为RuntimeException.

我已经验证KeyFactory.getInstance从BC提供程序返回KeyFactory.在Wildfly外部运行此代码非常有效.(我不得不把bcprov-ext-jdk15on-154.jar放到java的/ lib/ext中).

我已经尝试更新野生动物的bouncycastle模块,目前我已经添加了http://www.bouncycastle.org/latest_releases.html上发布的所有6个罐子

堆栈跟踪的有趣部分是

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)
Run Code Online (Sandbox Code Playgroud)

希望有人可以帮助我:-)提前谢谢

编辑:我已经尝试了其他模式的代码,看起来没有事件单一被识别.使用EC这种情况有所不同,因为它使用了其他提供程序,但配置提供程序列表表明BC位于顶部的yelds仍然是我提到的相同的异常.

编辑我认为它可能是某种类加载问题,所以我转向详细登录,这里是有趣的日志

[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!/]
Run Code Online (Sandbox Code Playgroud)

KeyFactorySpi和ECKeySpec来自两个不同的jar(类加载器?)因此KeyFactory中使用的instanceof失败

Mar*_*vňa 6

终于找到了问题:-)

当我打开类加载器的详细日志记录时,我发现KeySpec从不同的类加载器作为KeyFactorySpi进行检查,后者检查了KeySpec的实例.这是我在解决这个问题时遇到的问题.由于Wildfly 10附带了BouncyCastle模块,RestEasy依赖它,它会被加载.我使用的Hovever库也提供了一些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>
Run Code Online (Sandbox Code Playgroud)

这让我可以将wildfly的模块用于BouncyCastle.Hovewer,当我这样做时,我已经尝试将BouncyCastle放在我用来运行服务器的lib/ext/JRE中.这导致与另一个原因完全相同的错误:-)

总而言之,当使用BouncyCastle和wildfly 10时,你必须确保以下内容:

  1. 创建依赖于Wildfly模块的jboss-deployment-structure.xml}或者,您可以使用MANIFEST.mf来执行此操作
  2. 确保您在使用的JRE的lib/ext /中没有BouncyCastle提供程序
  3. 如果你动态添加BouncyCastle JCE提供程序,你还必须使用JCE Unlimited策略文件(如果你当然合法的话)

希望这有助于未来的人:-)