java - mac - openssl online
OpenSSL con Java (6)
En primer lugar: ¿para qué necesitas la biblioteca?
- Si va a utilizar funciones criptográficas simples, use los componentes de seguridad de Java SE implementados con el JDK.
- Si necesita funciones más avanzadas (como algunos formatos de firma digital, etc.), use una biblioteca criptográfica ( bouncycastle es una de las más populares)
- Pero, si lo que necesita es abrir conexiones SSL desde el código Java y manejar la autenticación de certificados, etc., no necesitará ninguno de estos:
- Si está trabajando en un contenedor Java EE, su contenedor puede validar las solicitudes SSL entrantes: es solo una cuestión de configuración
- Además, si necesita conectarse a un puerto SSL, el JDK presenta algunas clases básicas para hacerlo (vea este ejemplo ). Tenga en cuenta que, en este caso, deberá configurar algunas propiedades del sistema en su comando java.
Al igual que estas propiedades:
-Djavax.net.ssl.keyStore=keystore_path
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=truststore_path
-Djavax.net.ssl.trustStorePassword=trustword
Tengo que usar OpenSSL en un proyecto web de Java y no sé nada sobre ''OpenSSL''.
¿Cómo puedo integrar OpenSSL con mi proyecto? ¿Hay algún buen tutorial fundamental para aprender esto?
Hay muchas bibliotecas nativas de Java para crypto. Sin embargo, generalmente no son totalmente interoperables con OpenSSL, a veces son significativamente más lentos (consulte las métricas en el sitio a continuación) y no son compatibles con todas las plataformas. OpenSSL definitivamente es compatible con casi todas las plataformas y, en general, es eficaz.
Dicho esto, hay algunas ventajas de seguridad al usar criptografía basada en máquinas virtuales. Esto también debería ser una consideración.
El grupo Apache ha creado una biblioteca para Java que utiliza JNI para acceder a openssl para el cifrado AES. Creo que es el mejor ejemplo público de usar JNI para acceder a openssl, y puede hacer referencia a él fácilmente utilizando maven.
https://github.com/apache/commons-crypto
Si lo desea, puede extraer la parte de enlace de JNI de la biblioteca e implementar las funciones que necesita.
Este makefile muestra cómo usar javah para obtener lo que necesita de .class para construir el código .c:
https://github.com/apache/commons-crypto/blob/master/Makefile
Específicamente, esta línea en el Makefile llama javah: $(JAVAH) -force -classpath $(TARGET)/classes -o $@ org.apache.commons.crypto.cipher.OpenSslNative
para producir el archivo "OpenSslNative.h" correcto en el OpenSslNative.class.
Tenga en cuenta cómo import java.nio.ByteBuffer;
se utiliza para permitir buffers de salida de C.
El programa .c asociado está aquí:
Está escrito teniendo en cuenta el soporte multiplataforma, y es un buen ejemplo. Cada función exportada debe comenzar con JNIEXPORT
, y puede ver cómo está la ruta de clase completa en cada nombre de función.
He visto muchos enlaces JNI incorrectos, pasando cadenas, etc. Comenzar con una base sólida ayuda a crear una buena integración de OpenSSL en Java.
La mejor solución: use la seguridad incorporada de Java para tareas simples o use BouncyCastle para tareas más avanzadas.
Si TIENE QUE usar OpenSSL desde Java, tiene 2 opciones:
- Llame a openssl como un proceso desde Java.
- Cree una capa JNI para OpenSSL, pero eso me parece una completa pérdida de tiempo. Ninguna de esas son realmente buenas maneras de hacerlo.
Necesita responder algunas preguntas importantes antes de cualquier sugerencia
1) ¿Realmente desea llamar a la implementación de C ++ (nativo) JAVA?
2) ¿Cuáles son las características de openssl que no pueden ser resueltas por JCE y Bouncycastle?
3) ¿Se limita el alcance al uso de certificados generados por openssl, descifrando los archivos generados por openssl?
Todos hablan de BouncyCastle, pero en nuestro caso de uso, Gnu Crypto Library ganó el día. Java nativo
Nuestra base de datos (aerospike) dedica al menos el 10% de su tiempo a calcular hashes en java, para algunos clientes, simplemente porque estas implementaciones son lentas. Doy la bienvenida cuando hay una implementación nativa de las bibliotecas criptográficas disponibles en cada máquina Linux. Pensé que algunas de las máquinas virtuales Java7 iban a incluir más algoritmos, pero todavía no las he visto.
Apache Tomcat Native Library es la solución. https://github.com/apache/tomcat-native
Utiliza OpenSSL para capacidades TLS / SSL. Puede usarlo como biblioteca independiente (como lo hice) o conectar su Tomcat. Es un proyecto de código abierto con código Java bien documentado.
¿Por qué tomcat nativo?
JSSE es lento y difícil de usar. En mi proyecto para obtener el mejor rendimiento, hemos decidido buscar / escribir un contenedor JNI para OpenSSL, ya que la posibilidad de actualizar los certificados sobre la marcha es un signo de interrogación y los Key Stores son demasiado complejos.
Como las API de Bouncy Castle Crypto están escritas en Java, no se puede esperar la mejor eficiencia.
Tomcat Native es un contenedor, por lo que está limitado solo a las capacidades de su versión OpenSSL.