2017-06-09 1 views
2

J'essaie de créer un projet JavaEE existant en utilisant Wildfly Swarm, mais je continue à rencontrer un problème dans l'une de mes bibliothèques. Il est supposé charger une clé publique au format PEM depuis un serveur et l'utiliser pour vérifier les signatures. Cependant, je continue à recevoir ceci:BouncyCastle NoSuchProviderException, même s'il s'agit d'une dépendance Maven

2017-06-08 20:55:59,229 ERROR [stderr] (default task-3) java.security.NoSuchProviderException: no such provider: BC 
2017-06-08 20:55:59,234 ERROR [stderr] (default task-3)  at sun.security.jca.GetInstance.getService(GetInstance.java:83) 
2017-06-08 20:55:59,238 ERROR [stderr] (default task-3)  at sun.security.jca.GetInstance.getInstance(GetInstance.java:206) 
2017-06-08 20:55:59,238 ERROR [stderr] (default task-3)  at java.security.KeyFactory.getInstance(KeyFactory.java:211) 
2017-06-08 20:55:59,239 ERROR [stderr] (default task-3)  at enterprises.mccollum.wmapp.ssauthclient.PublicKeySingleton.loadPubKey(PublicKeySingleton.java:83) 
2017-06-08 20:55:59,239 ERROR [stderr] (default task-3)  at enterprises.mccollum.wmapp.ssauthclient.PublicKeySingleton.init(PublicKeySingleton.java:57) 

Le code qui provoque le problème est ici:

PublicKeySingleton.java snippet: 
81: PemObject pemPubKey = ldPemFromServer(); 
82: if(pemPubKey != null){ 
83: KeyFactory kf = KeyFactory.getInstance("RSA", BouncyCastleProvider.PROVIDER_NAME); 
84: PublicKey lPubKey = kf.generatePublic(new X509EncodedKeySpec(pemPubKey.getContent())); 
85: Logger.getLogger(SSAuthClient.SUBSYSTEM_NAME).log(Level.INFO, "Read public key from url successfully"); 
86: return lPubKey; 

Voici le pom.xml pour la bibliothèque avec le code ci-dessus:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>enterprises.mccollum.wmapp</groupId> 
    <artifactId>ssauthclient</artifactId> 
    <version>1.0.5-SNAPSHOT</version> 

    <properties> 
     <maven.compiler.source>1.8</maven.compiler.source> 
     <maven.compiler.target>1.8</maven.compiler.target> 
     <failOnMissingWebXml>false</failOnMissingWebXml> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>2.8.0</version> 
     </dependency> 
     <dependency> 
      <groupId>enterprises.mccollum.utils</groupId> 
      <artifactId>genericentityejb</artifactId> 
      <version>1.0.5</version> 
     </dependency> 
     <dependency> 
      <groupId>enterprises.mccollum.jee</groupId> 
      <artifactId>urlutils</artifactId> 
      <version>1.0.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcprov-jdk15on</artifactId> 
      <version>1.56</version> 
      <!-- Tried changing the version to 1.52, as used by Swarm itself, but to no avail --> 
     </dependency> 
    </dependencies> 
    <build> 
     <finalName>ssauthclient</finalName> 
     <extensions> 
      <extension> 
       <groupId>org.apache.maven.wagon</groupId> 
       <artifactId>wagon-webdav</artifactId> 
       <version>1.0-beta-2</version> 
      </extension> 
     </extensions> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-source-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>attach-sources</id> 
         <goals> 
          <goal>jar</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-javadoc-plugin</artifactId> 
       <executions> 
        <execution> 
        <id>attach-javadocs</id> 
         <goals> 
          <goal>jar</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Et voici le pom.xml pour le projet Swarm:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>ie.countries.cdn</groupId> 
    <artifactId>cbook</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <properties> 
     <version.wildfly.swarm>2017.6.0</version.wildfly.swarm> 
     <maven.compiler.source>1.8</maven.compiler.source> 
     <maven.compiler.target>1.8</maven.compiler.target> 
     <failOnMissingWebXml>false</failOnMissingWebXml> 
    </properties> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.wildfly.swarm</groupId> 
       <artifactId>bom</artifactId> 
       <version>${version.wildfly.swarm}</version> 
       <scope>import</scope> 
       <type>pom</type> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>enterprises.mccollum.wmapp</groupId> 
      <artifactId>ssauthclient</artifactId> 
      <version>1.0.5-SNAPSHOT</version> 
     </dependency> 
     <dependency> 
      <groupId>org.primefaces</groupId> 
      <artifactId>primefaces</artifactId> 
      <version>6.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.ocpsoft.rewrite</groupId> 
      <artifactId>rewrite-servlet</artifactId> 
      <version>3.4.1.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.ocpsoft.rewrite</groupId> 
      <artifactId>rewrite-config-prettyfaces</artifactId> 
      <version>3.4.1.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.primefaces.themes</groupId> 
      <artifactId>bootstrap</artifactId> 
      <version>1.0.10</version> 
     </dependency> 
     <dependency> 
      <groupId>org.omnifaces</groupId> 
      <artifactId>omnifaces</artifactId> 
      <version>2.6.2</version> 
     </dependency> 
     <!-- WildFly Swarm Fractions --> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>cdi</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>ejb</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>management</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>datasources</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <version>1.4.195</version> 
     </dependency> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>management-console</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>cdi-config</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>jsf</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>jaxrs</artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>cbook</finalName> 
     <resources> 
      <resource> 
       <directory>src/main/java</directory> 
       <includes> 
        <include>META-INF/persistence.xml</include> 
       </includes> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-source-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>attach-sources</id> 
         <goals> 
          <goal>jar</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.wildfly.swarm</groupId> 
       <artifactId>wildfly-swarm-plugin</artifactId> 
       <version>${version.wildfly.swarm}</version> 

       <executions> 
        <execution> 
         <goals> 
          <goal>package</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Je suis très confus quant à la raison pour laquelle cela ne fonctionnerait pas, en particulier lorsque le uberjar et la guerre produits par mvn package incluent la dépendance du fournisseur bouncycastle en tant que jar.

Qu'est-ce qui ne va pas? Est-ce un bug dans Swarm ou est-ce que je manque un truc que je dois faire pour le faire fonctionner?

+0

le pom de l'essaim ne semble pas contenir de dépendance au château gonflable. –

+0

mais il contient une dépendance (ssauthclient) qui fait (que pom est le premier dans la question) – KG6ZVP

Répondre

1

Le fournisseur n'est pas dans la machine virtuelle Java par défaut (vous pouvez vérifier la liste des fournisseurs dans $JAVA_HOME/jre/lib/security/java.security ou à l'aide de Security.getProviders()).

Vous devez ajouter à l'aide de la classe Security:

import java.security.Security; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 

Security.addProvider(new BouncyCastleProvider()); 

Certaines personnes préfèrent vérifier si le fournisseur est déjà là, et d'ajouter que si ce n'est pas:

// if provider is not present, add it 
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { 
    // insert at specific position 
    Security.insertProviderAt(new BouncyCastleProvider(), 1); 
} 

La différence entre la méthodes ci-dessus est que addProvider ajoute le fournisseur à la fin de la liste des fournisseurs (celui retourné par getProviders), et insertProviderAt l'ajoute à la position spécifiée (et les autres sont décalés).

Une autre alternative consiste à modifier le fichier $JAVA_HOME/jre/lib/security/java.security et ajouter le fournisseur à la position désirée:

security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider 

Plus de détails sur cette méthode peut être trouvée here.

+0

Qu'est-ce qui le rend différent d'une instance régulière de Wildly? Je peux exécuter la même application sur un serveur d'application Java EE standard sans avoir à faire face à ce problème supplémentaire. Ou, cela ne devrait-il pas fonctionner et c'est un bug? – KG6ZVP

+0

Certains serveurs peuvent déjà charger BouncyCastle au démarrage ou l'avoir déjà configuré quelque part.Mais ce n'est pas garanti que tous les serveurs le feront, donc vous devrez l'ajouter à la main. Vous pouvez utiliser la méthode 'getProvider' pour vérifier si elle est déjà chargée et l'ajouter en conséquence. –

+1

Merci. J'ai corrigé la bibliothèque pour le faire et maintenant je l'ai fait fonctionner. – KG6ZVP

0

Vous devez installer BouncyCastle en tant que fournisseur. Deux façons: d'abord en java pur:

Security.addProvider(new BouncyCastleProvider()); 

Deuxième méthode statiquement comme une entrée dans le fichier java.security:

security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider 

vous en avez besoin dans votre classpath évidemment.