2017-06-09 1 views
2

Ich versuche, ein vorhandenes JavaEE-Projekt mit Wildfly Swarm zu erstellen, aber ich laufe immer wieder auf ein Problem in einer meiner Bibliotheken. Es soll einen öffentlichen Schlüssel im PEM-Format von einem Server laden und damit Signaturen verifizieren. Allerdings erhalte ich dieses:BouncyCastle NoSuchProviderException, obwohl es eine Maven-Abhängigkeit ist

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) 

Der Code, der die Mühe verursacht hier:

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; 

Hier ist die pom.xml für die Bibliothek mit dem obigen Code:

<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> 

Und hier ist die pom.xml für das Swarm-Projekt:

Ich bin sehr verwirrt darüber, warum das nicht funktionieren würde, besonders wenn sowohl der Uberjar als auch der Krieg, die von mvn package produziert wurden, die Abhängigkeit des Bouncycastle-Anbieters als Jar enthalten.

Was läuft falsch? Ist das ein Fehler in Swarm oder fehlt mir ein Trick, den ich machen muss, um es zum Laufen zu bringen?

+0

Der Schwarmpom scheint keine Abhängigkeit von der Hüpfburg zu enthalten. –

+0

aber es enthält eine Abhängigkeit (ssauthclient), die (das Pom ist der erste in der Frage) – KG6ZVP

Antwort

1

Der Anbieter ist standardmäßig nicht in der JVM (Sie können die Liste der Anbieter in $JAVA_HOME/jre/lib/security/java.security oder Security.getProviders() überprüfen).

Sie fügen muss er die Security-Klasse:

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

Security.addProvider(new BouncyCastleProvider()); 

Einige Leute zu überprüfen bevorzugen, wenn der Anbieter bereits vorhanden ist, und nur hinzufügen, wenn es nicht:

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

Der Unterschied zwischen der Methoden oben ist, dass addProvider fügt den Anbieter am Ende der Anbieterliste (die von getProviders zurückgegeben), und insertProviderAt fügt es an der angegebenen Position (und die anderen sind verschoben).

Eine weitere Alternative ist die $JAVA_HOME/jre/lib/security/java.security-Datei und fügen Sie den Provider an der gewünschten Position zu bearbeiten:

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

Mehr Informationen zu diesem Verfahren können here finden.

+0

Was unterscheidet dies von einer regulären Wildly-Instanz? Ich kann die gleiche Anwendung auf einem normalen Java EE App-Server ausführen, ohne diesen zusätzlichen Aufwand zu verursachen. Oder sollte das nicht funktionieren und es ist ein Fehler? – KG6ZVP

+0

Einige Server laden BouncyCastle möglicherweise bereits beim Start oder haben sie bereits irgendwo konfiguriert.Aber es ist nicht garantiert, dass alle Server das tun, also müssen Sie es von Hand hinzufügen. Sie können die 'getProvider'-Methode verwenden, um zu überprüfen, ob sie bereits geladen ist, und sie entsprechend hinzuzufügen. –

+1

Vielen Dank. Ich habe die Bibliothek korrigiert, um dies zu tun und jetzt funktioniert es. – KG6ZVP

0

Sie müssen BouncyCastle als Anbieter installieren. Zwei Möglichkeiten: Zuerst in reinem Java:

Security.addProvider(new BouncyCastleProvider()); 

Zweite Methode statisch als Eintrag in die Datei java.security:

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

Sie müssen es in Ihrem Classpath offensichtlich.

Verwandte Themen