wake-up-neo.net

bouncycastle + JBoss AS7: JCE kann den Anbieter-BC nicht authentifizieren

Ich verwende BouncyCastle zur Verschlüsselung in meiner Anwendung. Wenn ich es alleine laufe, funktioniert alles gut. Wenn ich es jedoch in die webapp stecke und auf JBoss-Server implementiere, erhalte ich die folgende Fehlermeldung:

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)

Hier ist ein Teil des Codes, der diesen Fehler verursacht:

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

Und die Abhängigkeit von Maven:

<dependency>
    <groupId>bouncycastle</groupId>
    <artifactId>bcmail-jdk16</artifactId>
    <version>140</version>
</dependency>

Wissen Sie, wie ich es einsetzen könnte?

23
mrzasa

Setzen Sie das Hüpfburg nicht als Teil Ihrer Web-App (WEB-INF/lib) ein. Sie benötigen diese Datei natürlich zur Kompilierungszeit, aber auf JBOSS sollte es hier sein:

$JBOSS_HOME/server/default/lib/

anstatt

yourapp/WEB-INF/lib
14
Gergely Bacso

Für JBoss AS7 muss Bouncy Castle als Servermodul eingesetzt werden. Dies ersetzt den server/default/lib-Mechanismus früherer Versionen (wie in der Antwort von Gergely Bacso erwähnt).

JBoss AS7 verwendet jdk1.6 +. Wenn Sie JBoss AS7 mit jdk1.6 verwenden, müssen Sie sicherstellen, dass bcprov-jdk16 verwendet wird.

Erstellen Sie ein Jboss-Modul (einen Ordner $ JBOSS_HOME/modules/org/bouncycastle/main). Platzieren Sie die Bouncy Castle-Gläser, die global verfügbar sein sollen, zusammen mit einer module.xml-Datei, die wie folgt aussieht: 

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

Nachdem Sie das Modul eingerichtet haben, müssen Sie es für Ihre Bereitstellungen verfügbar machen. Es gibt zwei Möglichkeiten:

1. Global über standalone.xml

In $ JBOSS_HOME/standalone/configuration/standalone.xml ersetzen

<subsystem xmlns="urn:jboss:domain:ee:1.0"/>

mit 

<subsystem xmlns="urn:jboss:domain:ee:1.0">
    <global-modules>
        <module name="org.bouncycastle" slot="main"/>
    </global-modules>
</subsystem>

Die jar-Bibliotheken sind jetzt für alle Anwendungen verfügbar (und dies wird das Hinzufügen des Klassenpfads "emulieren", wie es in jboss 4,5,6 usw. möglich war).

2. Für eine bestimmte Bereitstellung (bevorzugt)

Fügen Sie der META-INF/jboss-deployment-structure.xml-Datei des Ohrs unter dem Abschnitt einen Modulabhängigkeitseintrag hinzu, z. B .:

<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

Wenn Sie jedoch den Server von JBoss auf andere Server umstellen (z. B. Glassfish), haben Sie dasselbe Problem.
Die bessere Lösung für mich sind Änderungen in jdk.
Sie sollten Bouncy Castle in zwei Schritten zu Sicherheitsanbietern auf Ihrer Java-Plattform hinzufügen:
1. Kopieren Sie BC-Bibliotheken (derzeit bcpkix-jdk15on-149.jar, bcprov-jdk15on-149.jar) in das Verzeichnis $ Java_HOME/jre/lib/ext/
2. BC-Anbieter registrieren: Datei bearbeiten $ Java_HOME/jre/lib/security/Java.security und unter Zeile

security.provider.1=Sun.security.provider.Sun

fügen Sie Ihren BC-Anbieter hinzu

security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider

Ändern Sie die Anzahl der Restanbieter. Der gesamte Anbieterblock sollte ähnlich sein:

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

Und jetzt müssen Sie den Java-Server gerade neu starten.

13

Wenn ich einen anderen Thread einlege, kann er auch programmgesteuert hinzugefügt werden, indem die Zeile gesetzt wird:

Security.addProvider (neuer org.bouncycastle.jce.provider.BouncyCastleProvider ());

Quelle: jce kann den Anbieter nicht authentifizieren. Bc

0
Lukasz

Für diejenigen, die die Konfiguration auf Serverebene nicht ändern möchten,

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

das Hinzufügen der Hüpfburggläser mit Use-Physical-Code-Source hat für mich funktioniert

0
David John