Я добавляю поддержку FIDO U2F к моему приложению J2EE (что в основном обеспечивает безопасность входа с аппаратным токеном). Я использую библиотеку из yubico, u2flib-server-core, которая обрабатывает криптографические операции в протоколе с помощью BouncyCastleCrypto. Hovewer, при декодировании открытого ключа из постоянного хранилища я получаю исключение с сообщениемWildfly 10 BouncyCastleCrypto ECDSA ключ не распознан
«ключ спецификации не распознан»
я сузил проблему вплоть до этой функции из библиотеки
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.
Я проверил, что KeyFactory.getInstance возвращает KeyFactory из поставщика BC. Запуск этого кода вне Wildfly работает отлично. (Мне пришлось поместить bcprov-ext-jdk15on-154.jar в/lib/ext java).
Я уже пытался обновить модуль wildfly в для BouncyCastle, в настоящее время я добавил все 6 банок, опубликованные на http://www.bouncycastle.org/latest_releases.html
Интересная часть из трассировки стека является
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)
Надежда кто-то может помочь мне :-) Спасибо заблаговременно
EDIT: Я пробовал этот код с другими режимами и выглядел как одно событие, которое не распознается. Использование EC. Экспрессия отличается тем, что использует другой провайдер, но, тем не менее, настраивая список поставщиков, что BC находится на верхних полях, все еще такое же исключение, как я упоминал.
EDIT Я думаю, что это может быть каким-то загрузки классов вопроса, поэтому я свернула ведение подробного журнала, и вот интересные журналы
[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 являются пришедшим из двух разных баночек (загрузчики классов?), Следовательно, InstanceOf используется в KeyFactory не удается
Большого спасибо за решением! –