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?

23
demandé sur mrzasa 2012-03-02 17:59:15

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
14
répondu Gergely Bacso 2012-03-02 15:05:37

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>
43
répondu James 2014-01-28 07:23:31

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.

13
répondu Krzysztof Szewczyk 2013-07-01 09:09:15

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

Source: jce ne peut pas authentifier le fournisseur bc

0
répondu Lukasz 2017-05-23 11:54:13

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

0
répondu David John 2018-07-12 13:51:09