2017-06-09 88 views
2

我想用Wildfly Swarm构建一个现有的JavaEE项目,但是我一直在遇到我的一个库中的问题。它应该从服务器加载PEM格式的公钥并用它来验证签名。不过,我不断收到这样的:BouncyCastle NoSuchProviderException即使它是一个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) 

引起麻烦的代码如下:

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; 

下面是与上面的代码pom.xml中的库:

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

这里是Swarm项目的pom.xml:

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

我很困惑,为什么这不起作用,特别是当由mvn package生成的uberjar和war包括作为jar的bouncycastle提供程序依赖项时。

什么问题?这是Swarm中的一个错误,还是我错过了一个我需要做的工作来让它工作?

+0

群体pom似乎不包含充气城堡依赖。 –

+0

,但它确实包含一个依赖项(ssauthclient),它确实(该问题是该问题中的第一个问题) – KG6ZVP

回答

1

默认情况下,提供者不在JVM中(您可以检查提供者列表$JAVA_HOME/jre/lib/security/java.security或使用Security.getProviders())。

必须使用Security类添加:

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

Security.addProvider(new BouncyCastleProvider()); 

有些人喜欢来检查供应商已经在那里,只有添加如果它不是:

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

之间的差异上面的方法是addProvider在提供者列表的末尾添加提供者(getProviders返回的提供者),并且insertProviderAt将其添加到指定位置(并且其他人被移位)。

另一种选择是在所希望的位置来编辑$JAVA_HOME/jre/lib/security/java.security文件,并添加提供商:

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

更多关于该方法的细节可发现here

+0

是什么使它与常规的Wildly实例有所不同?我可以在普通的Java EE应用服务器上运行相同的应用程序,而不会遇到额外的麻烦。或者,如果这不起作用,这是一个错误? – KG6ZVP

+0

某些服务器可能已经在启动时加载BouncyCastle,或者已经在某处配置了它。但并不能保证所有的服务器都能这样做,所以你必须手动添加它。您可以使用'getProvider'方法来检查它是否已经加载,并相应地添加它。 –

+1

谢谢。我已经纠正了图书馆这样做,现在有它的工作。 – KG6ZVP

0

您需要安装BouncyCastle作为提供程序。有两种方法:一是 在纯java:

​​

二静态方法作为入门到java.security文件:

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

你需要在你的classpath明显。