web-dev-qa-db-fra.com

OpenSSL avec Java

Je dois utiliser OpenSSL dans un projet Web Java et je ne connais rien à OpenSSL.

Comment puis-je intégrer OpenSSL à mon projet? Existe-t-il de bons tutoriels fondamentaux pour apprendre cela?

16
123Ex

Tout d’abord: pour quoi avez-vous besoin de la bibliothèque? 

  • Si vous envisagez d'utiliser des fonctions cryptographiques simples, utilisez les composants Java SE Security déployés avec le JDK.
  • Si vous avez besoin de fonctions plus avancées (telles que certains formats de signature numérique, etc.), utilisez une bibliothèque cryptographique ( BouncyCastle est l’une des plus populaires).
  • Toutefois, si vous avez besoin d'ouvrir des connexions SSL à partir de code Java et de gérer l'authentification par certificats, etc., vous n'aurez besoin d'aucun de ces éléments:
    • Si vous travaillez sur un conteneur Java EE, votre conteneur peut valider les demandes SSL entrantes: il ne s'agit que d'une question de configuration.
    • De plus, si vous devez vous connecter à un port SSL, le JDK présente quelques classes de base pour le faire (voir cet exemple ). Notez que dans ce cas, vous devrez définir certaines propriétés système sur votre commande Java.

Comme ces propriétés:

-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

Tout le monde parle de BouncyCastle, mais dans notre cas d'utilisation, la bibliothèque Gnu Crypto a gagné. Java natif.

Notre base de données (aérospike) consacre au moins 10% de son temps à calculer des hachages en Java, pour certains clients, tout simplement parce que ces implémentations sont lentes. Je me réjouis de la mise en œuvre native des bibliothèques de chiffrement disponibles sur chaque machine Linux. Je pensais que certaines des machines virtuelles Java7 incluraient davantage d'algorithmes, mais je ne les ai pas encore vues.

5
Brian Bulkowski

Meilleure solution: utilisez la sécurité intégrée de Java pour des tâches simples ou utilisez BouncyCastle pour des tâches plus avancées.

Si vous DEVEZ utiliser OpenSSL à partir de Java, vous avez 2 choix: 

  1. Appelez openssl en tant que processus Java.
  2. Créez une couche JNI pour OpenSSL, mais cela me semble être une perte de temps totale… __. Aucune de ces méthodes n'est vraiment une bonne façon de le faire.
4
Miyagi

Vous devez répondre à quelques questions importantes avant toute suggestion.

1) Voulez-vous vraiment appeler la forme d'implémentation JAVA C++ (native)?

2) Quelles sont les fonctionnalités d’openssl qui ne peuvent pas être résolues par JCE et Bouncycastle?

3) La portée est-elle simplement limitée à l'utilisation de certificats générés par openssl et au déchiffrement de fichiers générés par openssl? 

4
kiran.kumar M

Il existe de nombreuses bibliothèques natives Java pour crypto. Cependant, ils ne sont généralement pas totalement interopérables avec OpenSSL, sont parfois beaucoup plus lents (voir les métriques sur le site ci-dessous) et ne sont pas pris en charge sur toutes les plateformes. OpenSSL est définitivement supporté sur presque toutes les plateformes et est généralement performant.

Cela dit, l’utilisation de la crypto basée sur les ordinateurs virtuels présente certains avantages en termes de sécurité. Cela devrait également être une considération.

Le groupe Apache a créé une bibliothèque pour Java qui utilise JNI pour accéder à openssl pour le cryptage AES. Je pense que c'est le meilleur exemple public d'utilisation de JNI pour accéder à openssl, et vous pouvez le référencer facilement en utilisant maven.

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

Si vous le souhaitez, vous pouvez extraire la partie liaison de la bibliothèque JNI et implémenter les fonctions dont vous avez besoin. 

Ce makefile montre comment utiliser javah pour obtenir ce dont vous avez besoin dans la classe .class pour construire le code .c:

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

Plus précisément, cette ligne du Makefile appelle javah: $(JAVAH) -force -classpath $(TARGET)/classes -o $@ org.Apache.commons.crypto.cipher.OpenSslNative pour produire le fichier "OpenSslNative.h" approprié basé sur OpenSslNative.class.

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

Notez comment import Java.nio.ByteBuffer; est utilisé pour autoriser les tampons de sortie C.

Le programme associé .c est ici:

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

Il a été conçu pour prendre en charge plusieurs plates-formes et constitue un bon exemple. Chaque fonction exportée doit commencer par JNIEXPORT et vous pouvez voir comment se trouve le chemin d'accès complet à la classe dans chaque nom de fonction.

J'ai vu beaucoup de mauvaises liaisons JNI, des chaînes, etc. En partant d'une base solide, la construction d'une bonne intégration OpenSSL en Java est très utile.

0
Erik Aronesty

Apache Tomcat Native Library est la solution . https://github.com/Apache/Tomcat-native

Il utilise OpenSSL pour les fonctionnalités TLS/SSL. Vous pouvez l'utiliser comme bibliothèque autonome (comme je l'ai fait) ou connecter votre Tomcat. C'est un projet open source avec du code Java bien documenté. 

Pourquoi Tomcat natif?

JSSE est lent et difficile à utiliser . Dans mon projet pour obtenir les meilleures performances, nous avons décidé de trouver/écrire un wrapper JNI pour OpenSSL car la possibilité de mettre à niveau des certificats à la volée est un point d'interrogation et les magasins de clés sont trop complexes. . 

Comme les API Crypto de Bouncy Castle sont écrites en Java, vous ne pouvez pas vous attendre à une efficacité optimale.

Tomcat Native est un wrapper, vous n'êtes donc limité qu'aux fonctionnalités de votre version OpenSSL.

0
Tomasz