java SSL y cert keytore

165

¿Cómo sabe mi programa Java dónde está mi almacén de claves que contiene el certificado? O, alternativamente, ¿cómo le digo a mi programa Java dónde buscar el almacén de claves?

Después de especificar el almacén de claves de alguna manera, ¿cómo especificar el certificado que se utilizará para autenticar el servidor al cliente?

deborah
fuente
mejor es evitar el uso de la configuración System.setProperty (los enfoques a continuación), ver: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , cómo construir KeyManagerFactory para SSLContext
Marek- A-

Respuestas:

111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
DaveH
fuente
44
Alguien sabe cómo hacer referencia a esto en un cuadro de Windows? System.setProperty ("javax.net.ssl.trustStore", "C: \\ Archivos de programa (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); no funciona para mí :(
simgineer
44
En Windows, el nombre de ruta especificado debe utilizar barras diagonales, /, en lugar de barras diagonales inversas, \.
Droidman
¿Funcionó esto? Usé el mismo código donde mi archivo 'jks' contiene un certificado de CA. Pero todavía obtengo javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Error de transporte: 403 Error: Error prohibido cuando llamo al código del cliente a través de los stubs generados por SOAP. ¿Algunas ideas?
james2611nov
1
También hay una propiedad del sistema de contraseña (javax.net.ssl.trustStorePassword). También se puede pasar como argumentos JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword Consulte docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly
@ james2611nov: Si obtiene un error HTTP 403 (o cualquier otra respuesta HTTP) llamando a un punto final HTTPS, eso significa que superó con éxito la configuración de TLS: las interacciones HTTP tienen lugar solo una vez que se configura el canal TLS ( de lo contrario no podrían ser protegidos). Entonces, sí, esta respuesta aparentemente funcionó para usted. :-)
ruakh
295

Las propiedades SSL se establecen en el nivel JVM a través de las propiedades del sistema. Lo que significa que puede configurarlos cuando ejecuta el programa (java -D ....) O puede configurarlos en código haciendo System.setProperty.

Las teclas específicas que debe configurar están a continuación:

javax.net.ssl.keyStore : ubicación del archivo de almacén de claves Java que contiene el certificado y la clave privada del proceso de una aplicación. En Windows, el nombre de ruta especificado debe usar barras diagonales, /, en lugar de barras diagonales inversas.

javax.net.ssl.keyStorePassword : contraseña para acceder a la clave privada desde el archivo de almacén de claves especificado por javax.net.ssl.keyStore. Esta contraseña se usa dos veces: para desbloquear el archivo del almacén de claves (contraseña de la tienda) y para descifrar la clave privada almacenada en el almacén de claves (contraseña de la clave).

javax.net.ssl.trustStore : ubicación del archivo de almacén de claves Java que contiene la colección de certificados de CA en los que confía este proceso de aplicación (almacén de confianza). En Windows, la ruta especificada debe utilizar barras diagonales, /en lugar de las barras, \.

Si no se especifica una ubicación de almacén de confianza utilizando esta propiedad, la implementación de SunJSSE busca y utiliza un archivo de almacén de claves en las siguientes ubicaciones (en orden):

  1. $JAVA_HOME/lib/security/jssecacerts
  2. $JAVA_HOME/lib/security/cacerts

javax.net.ssl.trustStorePassword : contraseña para desbloquear el archivo de almacén de claves (contraseña de tienda) especificado por javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType - (Opcional) Para el formato de archivo de almacén de claves Java, esta propiedad tiene el valor jks (o JKS). Normalmente no especifica esta propiedad, porque su valor predeterminado ya es jks.

javax.net.debug : para activar el registro de la capa SSL / TLS, establezca esta propiedad en ssl.

Karthik Ramachandran
fuente
17
Sería más apropiado vincular al documento del cual se cita esto. Supongo que esto es todo: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno
44
El documento oficial debe ser la Guía de referencia de JSSE: docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/…
aleung
44
JDK7 docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/… es más apropiado ahora.
Rick-777
11
Para cualquiera que desee editar el almacén de confianza del sistema, la contraseña predeterminada es "changeit": community.oracle.com/thread/1540678?start=0&tstart=0
cwc
+1 para el accesorio javax.net.ssl.trustStorePassword. Había estado buscando por un tiempo y este fue el primero que lo mencionó.
jgreen
22

Solo una palabra de precaución. Si está intentando abrir un almacén de claves JKS existente en Java 9 en adelante, debe asegurarse de mencionar también las siguientes propiedades con valor como "JKS":

javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType

La razón es que el tipo de almacén de claves predeterminado según lo prescrito en el archivo java.security se ha cambiado a pkcs12 desde jks desde Java 9 en adelante.

Sankar Natarajan
fuente
11

En primer lugar, hay dos tipos de almacenes de claves.

Individual y general

La aplicación utilizará la indicada en el inicio o la predeterminada del sistema.

Será una carpeta diferente si se está ejecutando JRE o JDK, o si marca la personal o la "global".

También están encriptados

En resumen, el camino será como:

$JAVA_HOME/lib/security/cacerts para el "general", que tiene toda la AC para las Autoridades y es bastante importante.

Carlos garcia
fuente
Los tipos son 'almacén de claves' y 'almacén de confianza'. Por favor, no invente terminología redundante.
Marqués de Lorne
9

También puede mencionar la ruta en tiempo de ejecución utilizando las -Dpropiedades a continuación

-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks

En mi aplicación apache spark, solía proporcionar la ruta de los certificados y el almacén de claves usando la --confopción y extraJavaoptionsen spark-submit como se muestra a continuación

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
Balakumaran Muralidharan
fuente