26

アプリケーションの暗号化にはBouncyCastleを使用しています。スタンドアロンで実行すると、すべて正常に動作します。ただし、Webアプリケーションに配置してJBossサーバーにデプロイすると、次のエラーが発生します。

javax.servlet.ServletException: error constructing MAC: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
(...)
root cause
java.lang.Exception: error constructing MAC: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
(...)
root cause
java.io.IOException: error constructing MAC: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
    org.bouncycastle.jce.provider.JDKPKCS12KeyStore.engineLoad(Unknown Source)
    java.security.KeyStore.load(Unknown Source)

このエラーの原因となるコードの一部を次に示します。

    if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null)
    {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

    // Read the Private Key
    KeyStore ks = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME);
    ks.load(new FileInputStream(certificatePath), privateKeyPassword.toCharArray());

そしてMavenの依存関係:

<dependency>
    <groupId>bouncycastle</groupId>
    <artifactId>bcmail-jdk16</artifactId>
    <version>140</version>
</dependency>

どうすれば展開できるか知っていますか?

4

5 に答える 5

47

JBoss AS7の場合、弾力がある城はサーバーモジュールとしてデプロイする必要があります。これは、server/default/lib以前のバージョンのメカニズムを置き換えます(Gergely Bacsoの回答で述べたように)。

JBossAS7はjdk1.6+を使用します。jdk1.6でJBossAS7を使用する場合、bcprov-jdk16を使用していることを確認する必要があります。

Jbossモジュール(フォルダー$ JBOSS_HOME / modules / org / bouncycastle / main)を作成します。グローバルに利用できるようにしたい弾力のある城の瓶を、module.xml次のようなファイルと 一緒に入れます。

<module xmlns="urn:jboss:module:1.1" name="org.bouncycastle">
    <resources>
        <resource-root path="bcprov-jdk16-1.46.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api" slot="main" export="true"/>
    </dependencies>
</module>

モジュールをセットアップしたら、デプロイメントで使用できるようにする必要があります。2つの方法があります:

1.standalone.xmlを介してグローバルに

$JBOSS_HOME/standalone/configuration/standalone.xmlで置換

<subsystem xmlns="urn:jboss:domain:ee:1.0"/>

<subsystem xmlns="urn:jboss:domain:ee:1.0">
    <global-modules>
        <module name="org.bouncycastle" slot="main"/>
    </global-modules>
</subsystem>

jarライブラリがすべてのアプリケーションで利用できるようになります(これにより、jboss 4,5,6などで可能だったようにクラスパスへの追加が「エミュレート」されます)

2.特定の展開の場合(推奨)

モジュール依存関係エントリをearのMETA-INF/jboss-deployment-structure.xmlファイルのセクションの下に追加します。例:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <dependencies>
            <module name="org.bouncycastle" slot="main" export="true" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>
于 2012-05-01T14:18:44.607 に答える
14

bouncy-castle jarをWebアプリ(WEB-INF / lib)の一部としてデプロイしないでください。もちろん、コンパイル時にこのファイルが必要ですが、JBOSSでは次のようになります。

$JBOSS_HOME/server/default/lib/

それ以外の

yourapp/WEB-INF/lib
于 2012-03-02T15:05:37.420 に答える
13

ただし、サーバーをJBossから他のサーバー(Glassfishな​​ど)に変更した場合も同じ問題が発生します。
私にとってより良い解決策は、jdkの変更です。
次の2つの手順で、JavaプラットフォームのセキュリティプロバイダーにBouncy Castleを追加する必要があります。1。BCライブラリ(現在はbcpkix-jdk15on-149.jar、bcprov-jdk15on-149.jar)をディレクトリ$ JAVA_HOME / jre / lib /ext/にコピーします
2.BCプロバイダーを登録します。ファイル$JAVA_HOME/ jre / lib / security/java.securityを編集します。

security.provider.1=sun.security.provider.Sun

BCプロバイダーを追加する

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

残りのプロバイダーの数を変更します。プロバイダーのブロック全体は、次のようになります。

security.provider.1=sun.security.provider.Sun
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=sun.security.ec.SunEC
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.6=com.sun.crypto.provider.SunJCE
security.provider.7=sun.security.jgss.SunProvider
security.provider.8=com.sun.security.sasl.Provider
security.provider.9=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.10=sun.security.smartcardio.SunPCSC

そして今、あなたはただJavaサーバーを再起動する必要があります。

于 2013-07-01T09:09:15.927 に答える
0

他のスレッドを挿入すると、次の行を挿入することでプログラムで追加することもできます。

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

ソース: jceはプロバイダーbcを認証できません

于 2015-12-03T16:57:00.163 に答える
0

サーバーレベルの構成を変更したくない場合は、

<jboss-deployment-structure>  
   <deployment>  
      <resources>  
         <resource-root path="WEB-INF/lib/bcprov-jdk16-1.46.jar" use-physical-code-source="true"/>  
      </resources>  
   </deployment>  
</jboss-deployment-structure>  

use-physical-code-sourceで弾力のある城の瓶を追加することは私のために働いた

于 2018-07-12T13:51:09.470 に答える