bouncycastle + JBoss AS7: JCE ne peut pas authentifier le fournisseur BC
j'utilise BouncyCastle pour le cryptage dans mon application. Quand je l'exécute seul, tout fonctionne très bien. Cependant, si je le mets dans l'application web et que je me déploie sur le serveur JBoss, j'obtiens l'erreur suivante:
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)
Voici une partie du code qui cause cette erreur:
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());
et dépendance maven:
<dependency>
<groupId>bouncycastle</groupId>
<artifactId>bcmail-jdk16</artifactId>
<version>140</version>
</dependency>
savez-vous comment le déployer?
5 réponses
ne déployez pas le pot de Château gonflable comme une partie de votre votre webapp (WEB-INF/lib). Vous avez besoin de ce fichier dans le temps de compiliation bien sûr, mais sur JBOSS il devrait être ici:
$JBOSS_HOME/server/default/lib/
au lieu de
yourapp/WEB-INF/lib
pour le château gonflable AS7 de JBoss doit être déployé comme un module de serveur. Ceci remplace le mécanisme server/default/lib
des versions précédentes (comme mentionné dans la réponse de Gergely Bacco).
JBoss AS7 utilise jdk1.6+. Lors de l'utilisation de JBoss AS7 avec jdk1.6 nous devons nous assurer que nous utilisons bcprov-jdk16.
créer un module Jboss (un dossier $JBOSS_HOME/modules/org/bouncycastle/main).
Mettez les pots de Château gonflable que vous voulez être disponible dans le monde entier, avec un fichier module.xml
qui ressemble à ceci:
<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>
une fois que vous avez configuré le module, vous devez le rendre disponible pour vos déploiements. Il y a deux façons:
1. À l'échelle mondiale via autonome.xml
en $JBOSS_HOME/standalone/configuration/standalone.remplacer
<subsystem xmlns="urn:jboss:domain:ee:1.0"/>
avec
<subsystem xmlns="urn:jboss:domain:ee:1.0">
<global-modules>
<module name="org.bouncycastle" slot="main"/>
</global-modules>
</subsystem>
les bibliothèques jar seront désormais disponibles dans tous les applications (et cela" émulera "ajouter à la classe Path comme cela a été possible dans jboss 4,5,6 etc)
2. Pour un déploiement spécifique (de préférence)
ajouter une entrée de dépendance de module au fichier META-INF/jboss-deployment-structure.xml
de l'AER, sous la section, par exemple:
<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>
mais si vous changez de serveur de JBoss à un autre (par exemple Glassfish) vous avez le même problème.
La meilleure solution pour moi sont les changements dans jdk.
Vous devez ajouter le château gonflable aux fournisseurs de sécurité sur votre plate-forme java en deux étapes:
1. Copie BC librarys (actuellement bcpkix-jdk15on-149.jar, bcprov-jdk15on-149.jar) to directory $ JAVA_HOME/jre/lib/ext /
2. Registre de la colombie-britannique fournisseur de: modifier le fichier $JAVA_HOME/jre/lib/security/java.sécurité et sous la ligne
security.provider.1=sun.security.provider.Sun
ajouter votre fournisseur BC
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
les numéros de Changement de repos fournisseurs. L'ensemble des prestataires devrait être similaire à:
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
et maintenant vous devez juste redémarrer le serveur java.
comme je l'ai mis dans un autre fil, il peut également être ajouté par programmation en mettant la ligne:
sécurité.addProvider (new org.bouncycastle.JCE.Fournisseur.BouncyCastleProvider ());
pour ceux qui ne veulent pas changer la configuration au niveau du serveur,
<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>
ajouter les pots de Château gonflables avec l'utilisation-physique-code-source a fonctionné pour moi