2016-03-27 7 views
4

Я добавляю поддержку 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 не удается

ответ

5

Наконец нашел вопрос :-)

Когда я включил многословное протоколирование из загрузчиков классов я обнаружил, что KeySpec является пришедшим п rom разного загрузчика классов как KeyFactorySpi, который проверял экземпляр этого KeySpec. Это проблема, которую я вызвал во время решения этой проблемы. Поскольку wildfly 10 поставляется с модулем BouncyCastle, от которого зависит RestEasy, он загружается. Библиотека Hovever, которую я использовал, также отправила некоторые классы BouncyCastle.

Все, что я должен был сделать создание JBoss-развертывания-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 в lib/ext/JRE, с которым я использовал сервер. Это вызвало точно такую ​​же ошибку с другой причиной :-)

Так, чтобы подвести итог, при использовании BouncyCastle с wildfly 10 вы должны обеспечить следующее:

  1. Создание JBoss-развертывания-структуры.xml с зависимостью от модуля Wildfly} или, альтернативно, вы можете использовать MANIFEST.mf для этого |
  2. Убедитесь, что у вас нет поставщика BouncyCastle в Lib/вн/из JRE вы используете
  3. При добавлении поставщика BouncyCastle ОКО dynamicaly, вы также должны использовать JCE файлы Безлимитный политики (если вы на законных основаниях может конечно)

Надеется, что это поможет кому-то в будущем :-)

+0

Большого спасибо за решением! –