Comúnmente nos vamos a encontrar con esta excepción:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
La excepción anterior sucede cuando intentamos por ejemplo consumir un servicio web con seguridad https://222.156.221.139/miservicio/WSunservicio.asmx?wsdl
Para este caso lo que necesitamos hacer es instalar el certificado en la maquina virtual de Java (específicamente en el keystore) que tengamos instalado en nuestro equipo para pruebas locales y cuando estemos en ambientes productivos, en la maquina virtual del servidor correspondiente.
La pregunta es, ¿Donde encontramos el famoso keystore de nuestra maquina virtual?. Este archivo se encuentra comúnmente en el JRE.
Por ejemplo, en mi caso esta en la siguiente ruta.
/urs/share/java/jdk1.7.0_07/jre/lib/security
o si estamos en un ambiente de Windows:
C:\Program Files\Java\jre7\lib\security\cacerts
Este es un ejemplo de mi PC. |
Ahora que ya ubicamos el keystore, vamos a obtener el certificado usando un browser, por ejemplo usando el firefox.
- Pega la url donde se encuentra el recurso del cual queremos obtener el certificado.
- Aceptemos e instalemos el certificado con la finalidad de que no nos lo vuelva a pedir
- Con el paso anterior, ya hemos instalado el certificado en nuestra computadora.
- Para instalar el nuevo certificado (que ya esta en nuestra computadora) en la JVM, necesitamos ayudarnos con una herramienta que ya viene instalada en la maquina virtual y que se llama keytool. Esta es una herramienta que se maneja a nivel de consola, pero existen utilerias que nos ayudan a realizar la misma tarea pero gráficamente. Una de ellas muy buena se llama portcle. http://portecle.sourceforge.net/
- Ahora, vamos a usar el keytool a nivel de consola para saber cuales son los certificados que tenemos instalados hoy en día.
- Si tenemos configurada las variables de entorno en nuestra maquina, entonces podemos invocar este comando desde cualquier parte de nuestro sistema de archivos. En caso contrario, tenemos que configurarla.
- Para ver los certificados existentes: keytool -list -keystore
(si nos pide algún password, escribamos el de por defecto: "changeit"). Si buscamos en la lista que nos despliega no tenemos el certificado actualmente, entonces vamos a instalarlo. - Busquemos en nuestra maquina en el IE bajo Tools->'Internet Options' ->Content->Certificates. Una vez abierto los certificados, localiza el que acabas de instalar y presiona el botón de Exportar. Guárdalo en cualquier parte de tu disco duro usando la opción "DER binario codificado".
- O si prefieres usar firefox, vete a Edit ->Preferences ->Advanced ->View Certificates. localiza el certificado que instalaste y presiona el botón de Exportar. Guárdalo en tu disco duro en cualquier carpeta que desees.
- Una vez que lo tenemos en nuestra PC. para mi caso "/home/wmb/Desktop/mis-certificados/CRISTAKAR-MEX4" lo instalamos usando el siguiente comando como se ve en la imagen:
- En Windows es lo mismo, vemos:
- C:\Users\mxe01505114a\Desktop\tmp>keytool -import -noprompt -trustcacerts -alias cristakar-mex4 -file c:\Users\mxe01505114a\Desktop\CRISTAKAR-MEX4.cer -keystore "c:\Program Files\Java\jre7\lib\security\cacerts" -storepass changeit
- Recuerda que debes de tener la variable de entorno de java configurada para invocar "keytool" desde cualquier lugar.
- Por ultimo comprobamos que el certificado se haya instalador correctamente con el siguiente comando que nos muestra todos los certificados de la JVM que tenemos instalados: keytool -list -keystore "C:\Program Files\Java\jre7\lib\security\cacerts"
- Eso es todo, ya tenemos el certificado en nuestra JVM, espero les haya sido útil.
Nota: Esto no es parte del tutorial, pero si les sirve que bueno. Si estan consumiendo un servicio web con https usando JAX-WS, esto les interesará:
Muy bueno, muchas gracias.
ResponderEliminaryo quisiera usar las claves generadas en keytool para cifrar , firmar y descifrar documentos pdf me gustaria hacer una aplicacion en java que realice eso.. pero no se como usar esos ficheros... algun ejemplo en codigo como podria ser factible eso
ResponderEliminarMe sirvio, Gracias!
ResponderEliminarMuchas gracias por la información
ResponderEliminarmuchas gracias por la información
ResponderEliminar