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?
Tout d’abord: pour quoi avez-vous besoin de la bibliothèque?
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
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.
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:
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?
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.
Notez comment import Java.nio.ByteBuffer;
est utilisé pour autoriser les tampons de sortie C.
Le programme associé .c est ici:
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.
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.