¿Cómo importo un nuevo certificado de CA de Java sin usar la utilidad de línea de comandos keytool?

StackOverflow https://stackoverflow.com/questions/1650596

  •  22-07-2019
  •  | 
  •  

Pregunta

Resumen ejecutivo: ¿cómo instalo un nuevo certificado raíz en Java usando código Java?

Tenemos una aplicación de escritorio que accede a varios servicios web. Recientemente uno de ellos cambió su certificado SSL a uno firmado por Trustwave. Si bien los buscadores regulares de Internet aceptan los certificados SSL Trustwave, Java no parece venir con los certificados raíz de prerrequisito, y perdimos el acceso al servicio web dado con el siguiente mensaje de error:

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

Obtuvimos un aplazamiento temporal al convencer al proveedor de que volviera a Verisign, pero cuando vuelvan a hacerlo tenemos que estar listos. Por lo tanto, necesito nuestro software de escritorio para instalar automáticamente el certificado raíz Trustwave según sea necesario. Nuestros clientes no son lo suficientemente expertos en tecnología para usar el comando keytool y prefiero no escribirlo, ya que me parece una solución frágil (implementaciones separadas para Mac y PC, la lucha contra las restricciones de ejecución de Vista, problemas para encontrar el JRE correcto para instalar en , etc.).

Me imagino que la herramienta de claves utiliza Java internamente. ¿Qué comando podría usar dentro de Java para replicar la funcionalidad de keytool e instalar el certificado raíz mediante programación?

¿Fue útil?

Solución

No sé si eso es posible, pero podría implementar su propio TrustManager para permitir esta conexión o esta CA. Aquí están lo básico.

Otros consejos

En mi humilde opinión, Sun no ha expuesto keytool a través de una API, principalmente para evitar que los desarrolladores modifiquen el conjunto de CA de confianza. Me imagino a los atacantes que explotan dicho código para insertar sus propios certificados raíz en el almacén de confianza comprometiendo el modelo mismo del almacén de confianza.

De hecho, si observa el origen de la clase KeyTool (paquete sun.security.tools), no solo es final, sino que también tiene un constructor privado que impide que cualquier persona que llama cree una instancia de la clase KeyTool desde el código . KeyTool tiene un método principal, por lo que la línea de comandos (y, por lo tanto, un usuario del sistema operativo) posiblemente sea la única forma en que se puede inicializar y comunicarse con KeyTool.

Los únicos enfoques (simplistas) que quedan serían:

  • Inicialice keytool como un proceso desde la aplicación y pase los argumentos de la línea de comandos para instalar el certificado de CA raíz. Esto por sí solo es una mala idea, y recomendaría notificar al usuario sobre lo que está ocurriendo.
  • Evite el uso de keytool y, en su lugar, proporcione a los usuarios instrucciones sobre cómo instalar la CA raíz utilizando Keyman o KeyTool IUI . Hablando por mí solo aquí, prefiero lo último.

Siempre puede invocar KeyTool como un proceso Runtime.exec (...) .

Si desea instalar el certificado en el almacén de claves de la raíz de confianza en la máquina de escritorio, necesitará permiso para hacerlo. Es lo mismo con la herramienta clave , necesita una contraseña para acceder al almacén de claves de la raíz de confianza. Si quieres ser rápido y sucio, puedes

  • escribir el certificado en un archivo o una secuencia de bytes o lo que sea
  • importar usando la clase KeyTool ( sun.security.tools.KeyTool )

Pero en mi humilde opinión, si el certificado no es válido, entonces no es confiable. Yo diría que hay una buena razón para eso.

Solución de línea de comandos. En Mac, el hogar de Java es / Library / Java / Home. Prueba:

$ sudo -i
# cd /Library/Java/Home
# keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts

Sustituya CAName con el nombre de su CA y CA.crt con una ruta a su archivo de certificado (PEM funciona). Solicitará una contraseña de almacén de claves. La contraseña predeterminada se proporciona en el artículo vinculado.

Tuve que hacer esto para uno de los certificados de CA de RapidSSL.

Sun publicó este código para crear una versión actualizada de su archivo cacerts basado en cualquier host de destino que ejecute https con cualquier certificado:

https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

Sus nuevas cacerts se llamarán jssecacerts en el directorio actual. Simplemente copie ese nuevo archivo sobre su archivo jre / lib / security / cacerts.

No hago ningún comentario sobre la seguridad de su nuevo archivo cacerts.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top