アプリケーションの暗号化にはBouncyCastleを使用しています。スタンドアロンで実行すると、すべて正常に動作します。しかし、それをwebappに配置して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>
どうやってそれを配備できるか知っていますか?
バウンスキャッスルjarをWebアプリケーション(WEB-INF/lib)の一部としてデプロイしないでください。もちろんこのファイルはコンパイル時に必要ですが、JBOSSではここにあるはずです。
$JBOSS_HOME/server/default/lib/
の代わりに
yourapp/WEB-INF/lib
JBoss AS7の場合、弾力のある城をサーバーモジュールとしてデプロイする必要があります。これは、以前のバージョンのserver/default/lib
メカニズムに代わるものです(Gergely Bacsoの回答で述べたとおり)。
JBoss AS7はjdk1.6 +を使用します。 jsk1.6でJBoss AS7を使用する場合、bcprov-jdk16を使用していることを確認する必要があります。
Jbossモジュール(フォルダー$ JBOSS_HOME/modules/org/bouncycastle/main)を作成します。グローバルに使用可能にする弾力がある城のjarファイルを、次のような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つの方法があります。
$ 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などで可能だったように、クラスパスへの追加が「エミュレート」されます)。
耳の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>
しかし、サーバーをJBossから他のサーバー(Glassfishなど)に変更した場合も、同じ問題が発生します。
私にとってより良い解決策は、jdkの変更です。
あなたは、Bouncy CastleをYour Javaプラットフォームの2つのステップでセキュリティプロバイダーに追加する必要があります。
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サーバーを再起動するだけです。
他のスレッドを追加したので、次の行を追加してプログラムで追加することもできます。
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
ソース: jceはプロバイダーbcを認証できません
サーバーレベルの設定を変更したくない場合は、
<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で弾力のある城のjarファイルを追加するとうまくいきました