J'utilise BouncyCastle pour le cryptage dans mon application. Quand je le lance tout seul, tout fonctionne bien. Cependant, si je le mets dans l'application Web et le déploie sur le serveur JBoss, j'obtiens une 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 provoque 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 je pourrais le déployer?
Ne déployez pas le pot Bouncy-Castle dans le cadre de votre application Web (WEB-INF/lib). Bien sûr, vous avez besoin de ce fichier au moment de la compilation, mais sur JBOSS, il devrait être ici:
$JBOSS_HOME/server/default/lib/
au lieu de
yourapp/WEB-INF/lib
Pour JBoss AS7, le château gonflable doit être déployé en tant que module serveur. Cela remplace le mécanisme server/default/lib
des versions précédentes (comme mentionné dans la réponse de Gergely Bacso).
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éez un module Jboss (un dossier $ JBOSS_HOME/modules/org/bouncycastle/main) . Placez les bocaux du château gonflable que vous souhaitez avoir dans le monde, ainsi qu'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 le module installé, vous devez le rendre disponible pour vos déploiements. Il y a deux manières:
Dans $ JBOSS_HOME/standalone/configuration/standalone.xml, remplacez
<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 de fichiers jar seront désormais disponibles dans toutes les applications (et cela "émulera" en ajoutant au classpath comme cela était possible dans jboss 4,5,6, etc.)
Ajoutez une entrée de dépendance de module au fichier META-INF/jboss-deployment-structure.xml
de l'oreille, 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 en autre (par exemple, Glassfish), vous rencontrez le même problème.
La meilleure solution pour moi, ce sont les changements dans jdk.
Vous devez ajouter Bouncy Castle aux fournisseurs de sécurité sur votre plate-forme Java en deux étapes:
1. Copier les bibliothèques BC (actuellement bcpkix-jdk15on-149.jar, bcprov-jdk15on-149.jar) dans le répertoire $ Java_HOME/jre/lib/ext/
2. Enregistrer le fournisseur BC: modifier le fichier $ Java_HOME/jre/lib/security/Java.security et under line
security.provider.1=Sun.security.provider.Sun
ajouter votre fournisseur de BC
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
Changer le nombre de fournisseurs de repos. L'ensemble des fournisseurs devrait ressembler à:
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.
Lorsque je mets dans un autre thread, il peut également être ajouté par programme en mettant la ligne:
Security.addProvider (nouveau org.bouncycastle.jce.provider.BouncyCastleProvider ());
Pour ceux qui ne veulent pas changer de configuration de niveau 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>
l'ajout des bocaux du château gonflable avec use-physical-code-source a fonctionné pour moi