OpenSSL с Java - PullRequest
       14

OpenSSL с Java

18 голосов
/ 24 марта 2011

Мне нужно использовать OpenSSL в веб-проекте на Java, и я ничего не знаю о 'OpenSSL'.

Как я могу интегрировать OpenSSL с моим проектом?Есть ли хорошие фундаментальные учебники, чтобы узнать это?

Ответы [ 6 ]

22 голосов
/ 24 марта 2011

Прежде всего: для чего вам нужна библиотека?

  • Если вы собираетесь использовать простые криптографические функции, то используйте компоненты Java SE Security , развернутые с JDK.
  • Если вам нужны более продвинутые функции (например, некоторые форматы цифровой подписи и т. Д.), Используйте криптографическую библиотеку ( BouncyCastle - одна из самых популярных)
  • Но если вам нужно открыть SSL-соединения из Java-кода и обработать проверку подлинности сертификатов и т. Д., Вам не понадобится ничего из этого:
    • Если вы работаете с контейнером Java EE, ваш контейнер может проверять входящие запросы SSL: это всего лишь вопрос конфигурации
    • Кроме того, если вам необходимо подключиться к порту SSL, JDK предоставляет для этого некоторые базовые классы (см. этот пример ). Обратите внимание, что в этом случае вам нужно установить некоторые системные свойства в вашей команде java.

Мне нравятся эти свойства:

-Djavax.net.ssl.keyStore=keystore_path
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=truststore_path
-Djavax.net.ssl.trustStorePassword=trustword
5 голосов
/ 28 ноября 2012

Все говорят о BouncyCastle, но в нашем случае библиотека Gnu Crypto победила.Родной java.

Наша база данных (aerospike) тратит как минимум 10% своего времени на вычисление хэшей в java для некоторых клиентов просто потому, что эти реализации медленные.Я приветствую, когда есть собственная реализация библиотек шифрования, доступных на каждой машине Linux.Я думал, что некоторые виртуальные машины Java7 будут включать больше алгоритмов, но я еще не видел их.

4 голосов
/ 11 октября 2012

Лучшее решение: используйте встроенную защиту Java для простых задач или используйте BouncyCastle для более сложных задач.

Если вам необходимо использовать OpenSSL из Java, у вас есть 2 варианта:

  1. Вызов openssl как процесса из Java.
  2. Создайте слой JNI для OpenSSL, но мне кажется, что это пустая трата времени. Ни один из этих способов не подходит.
4 голосов
/ 24 марта 2011

Вам нужно ответить на несколько важных вопросов перед любыми предложениями

1) Вы действительно хотите назвать C ++ (нативную) форму реализации JAVA?

2) Какие функции в openssl, которыене могут быть решены с помощью JCE и Bouncycastle

3) Ограничена ли область действия только использованием сертификатов, сгенерированных openssl, расшифровкой файлов, сгенерированных openssl?

0 голосов
/ 31 августа 2018

Собственная библиотека Apache Tomcat - это решение. https://github.com/apache/tomcat-native

Он использует OpenSSL для возможностей TLS / SSL. Вы можете использовать его как автономную библиотеку (как я это сделал) или подключить свой Tomcat. Это проект с открытым исходным кодом с хорошо документированным Java-кодом.

Почему родной кот?

JSSE медленный и сложный в использовании. В моем проекте, чтобы добиться максимальной производительности, мы решили найти / написать упаковщик JNI для OpenSSL, поскольку возможность обновления сертификатов на лету - вопросительный знак, а хранилища ключей слишком сложны.

Поскольку API-интерфейсы Bouncy Castle Crypto написаны на Java, нельзя ожидать максимальной эффективности.

Tomcat Native - это оболочка, поэтому вы ограничены только возможностями вашей версии OpenSSL.

0 голосов
/ 25 июля 2018

Существует множество собственных библиотек Java для шифрования. Однако они, как правило, не полностью совместимы с OpenSSL, иногда значительно медленнее (см. Показатели на сайте ниже) и не поддерживаются на всех платформах. OpenSSL определенно поддерживается почти на каждой платформе и, как правило, эффективен.

При этом есть некоторые преимущества безопасности при использовании криптографии на основе VM. Это также следует учитывать.

Группа Apache создала библиотеку для Java, которая использует JNI для доступа к openssl для шифрования AES. Я думаю, что это лучший публичный пример использования JNI для доступа к openssl, и вы можете легко ссылаться на него, используя maven.

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

Если вы хотите, вы можете извлечь часть привязки JNI из библиотеки и реализовать нужные вам функции.

Этот make-файл показывает, как использовать javah для получения того, что вам нужно от .class для построения кода .c:

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

В частности, эта строка в Makefile вызывает javah: $(JAVAH) -force -classpath $(TARGET)/classes -o $@ org.apache.commons.crypto.cipher.OpenSslNative для создания правильного файла "OpenSslNative.h" на основе OpenSslNative.class.

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

Обратите внимание, как import java.nio.ByteBuffer; используется для разрешения выходных буферов C.

Связанная программа .c находится здесь:

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

Он написан с учетом кроссплатформенной поддержки и является хорошим примером. Каждая экспортируемая функция должна начинаться с JNIEXPORT, и вы можете видеть полный путь к классу в каждом имени функции.

Я видел много плохих привязок JNI, передачу строк и т. Д. Начиная с прочной основы, можно добиться хорошей интеграции OpenSSL в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...