web-dev-qa-db-de.com

OpenSSL mit Java

Ich muss OpenSSL in einem Java-Webprojekt verwenden und weiß nichts über 'OpenSSL'.

Wie kann ich OpenSSL in mein Projekt integrieren? Gibt es gute Grundübungen, um dies zu lernen?

16
123Ex

Zunächst einmal: Wofür brauchen Sie die Bibliothek? 

  • Wenn Sie einfache kryptografische Funktionen verwenden möchten, verwenden Sie die Java SE Security-Komponenten , die mit dem JDK bereitgestellt werden.
  • Wenn Sie erweiterte Funktionen benötigen (z. B. einige digitale Signaturformate usw.), verwenden Sie eine kryptografische Bibliothek ( BouncyCastle gehört zu den beliebtesten).
  • Wenn Sie jedoch SSL-Verbindungen aus Java-Code öffnen und die Zertifikatsauthentifizierung usw. handhaben müssen, benötigen Sie keine der folgenden Optionen:
    • Wenn Sie mit einem Java EE-Container arbeiten, kann Ihr Container eingehende SSL-Anforderungen überprüfen. Dies ist nur eine Frage der Konfiguration
    • Wenn Sie eine Verbindung zu einem SSL-Port herstellen müssen, stellt das JDK dazu einige grundlegende Klassen bereit (siehe dieses Beispiel ). Beachten Sie, dass Sie in diesem Fall einige Systemeigenschaften für Ihren Java-Befehl festlegen müssen.

Wie diese Eigenschaften:

-Djavax.net.ssl.keyStore=keystore_path
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=truststore_path
-Djavax.net.ssl.trustStorePassword=trustword
23
Tomas Narros

Jeder spricht über BouncyCastle, aber in unserem Anwendungsfall hat die Gnu Crypto-Bibliothek den Tag gewonnen. Natives Java.

Unsere Datenbank (Aerospike) verbringt bei einigen Kunden mindestens 10% ihrer Zeit mit dem Berechnen von Hashes in Java. Ich begrüße es, wenn auf jeder Linux-Maschine eine native Implementierung der Kryptobibliotheken verfügbar ist. Ich dachte, einige Java7-VMs würden mehr Algorithmen enthalten, aber ich habe sie noch nicht gesehen.

5
Brian Bulkowski

Beste Lösung: Verwenden Sie die integrierte Sicherheit von Java für einfache Aufgaben oder BouncyCastle für fortgeschrittenere Aufgaben.

Wenn Sie OpenSSL von Java verwenden müssen, haben Sie zwei Möglichkeiten: 

  1. Aufruf von openssl als Prozess aus Java.
  2. Machen Sie eine JNI-Schicht für OpenSSL, aber das scheint mir eine komplette Zeitverschwendung zu sein ... Keine dieser Möglichkeiten ist wirklich gut.
4
Miyagi

Sie müssen einige wichtige Fragen beantworten, bevor Sie Vorschläge machen

1) Möchten Sie die native C++ - Implementierung von JAVA aufrufen?

2) Welche Funktionen in openssl können von JCE und Bouncycastle nicht gelöst werden

3) Ist der Geltungsbereich auf die Verwendung von Zertifikaten beschränkt, die von openssl generiert wurden, und die von openssl generierten Dateien entschlüsselt? 

4
kiran.kumar M

Es gibt viele Java native Bibliotheken für Krypto. Sie sind jedoch in der Regel nicht vollständig mit OpenSSL interoperabel, sind manchmal erheblich langsamer (siehe Metriken auf der Website unten) und werden nicht auf allen Plattformen unterstützt OpenSSL wird definitiv auf fast jeder Plattform unterstützt und ist im Allgemeinen performant.

Trotzdem bietet die Verwendung von VM-basierter Krypto einige Sicherheitsvorteile. Dies sollte auch eine Überlegung sein.

Die Apache-Gruppe hat eine Bibliothek für Java verwendet JNI, um für die AES-Verschlüsselung auf openssl zuzugreifen. Ich denke, es ist das beste öffentliche Beispiel für die Verwendung von JNI, um auf openssl zuzugreifen, und Sie können es einfach mit maven referenzieren .

https://github.com/Apache/commons-crypto

Wenn Sie möchten, können Sie den JNI-Bindungsteil der Bibliothek herausziehen und die benötigten Funktionen implementieren.

Dieses Makefile zeigt, wie Sie mit javah aus der .class das bekommen, was Sie zum Erstellen des .c-Codes benötigen:

https://github.com/Apache/commons-crypto/blob/master/Makefile

Diese Zeile in dem Makefile ruft speziell javah: $(JAVAH) -force -classpath $(TARGET)/classes -o [email protected] org.Apache.commons.crypto.cipher.OpenSslNative auf, um die richtige "OpenSslNative.h" -Datei zu erstellen, die auf der OpenSslNative.class basiert.

https://github.com/Apache/commons-crypto/blob/master/src/main/Java/org/Apache/commons/crypto/cipher/OpenSslNative.Java

Beachten Sie, wie import Java.nio.ByteBuffer; wird verwendet, um C-Ausgabepuffer zuzulassen.

Das zugehörige .c-Programm finden Sie hier:

https://github.com/Apache/commons-crypto/blob/master/src/main/native/org/Apache/commons/crypto/cipher/OpenSslNative.c

Es wurde mit Blick auf plattformübergreifende Unterstützung geschrieben und ist ein gutes Beispiel. Jede exportierte Funktion muss mit JNIEXPORT beginnen, und Sie können sehen, wie der vollständige Klassenpfad in jedem Funktionsnamen enthalten ist.

Ich habe viele schlechte JNI-Bindungen, das Weitergeben von Zeichenfolgen usw. gesehen. Das Beginnen mit einer soliden Basis trägt wesentlich zum Aufbau einer guten OpenSSL-Integration in Java bei.

0
Erik Aronesty

Apache Tomcat Native Library ist die Lösung . https://github.com/Apache/Tomcat-native

Es verwendet OpenSSL für TLS/SSL-Funktionen. Sie können es als eigenständige Bibliothek (wie ich) verwenden oder Ihren Tomcat anschließen. Es ist ein Open-Source-Projekt mit gut dokumentiertem Java-Code. 

Warum ein Kater?

JSSE ist langsam und schwer zu bedienen .. In meinem Projekt zur Erzielung der besten Leistung haben wir uns entschieden, einen JNI-Wrapper für OpenSSL zu finden/zu schreiben, da die Möglichkeit eines sofortigen Upgrades von Zertifikaten ein Fragezeichen ist und Key Stores zu komplex sind . 

Da Bouncy Castle Crypto APIs in Java geschrieben sind, können Sie nicht mit bester Effizienz rechnen.

Tomcat Native ist ein Wrapper, daher sind Sie nur auf die Funktionen Ihrer OpenSSL-Version beschränkt.

0
Tomasz