web-dev-qa-db-fra.com

bouncycastle + JBoss AS7: JCE ne peut pas authentifier le fournisseur BC

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?

23
mrzasa

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
14
Gergely Bacso

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:

1. Globalement via standalone.xml

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

2. Pour un déploiement spécifique (préféré)

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

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.

13
Krzysztof Szewczyk

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 ());

Source: jce ne peut pas authentifier le fournisseur bc

0
Lukasz

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

0
David John