2009-10-30 9 views
8

Resumen ejecutivo: ¿cómo instalo un nuevo certificado raíz en Java usando código Java?¿Cómo importo un nuevo certificado de CA de Java sin utilizar la utilidad de línea de comandos de keytool?

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. Mientras que los certificados de Trustwave SSL son aceptados por los navegadores habituales de Internet, Java no parece que vienen con los certificados raíz de requisitos previos, y hemos perdido el acceso al servicio web especificada en el mensaje de error siguiente:

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 

Tenemos un temporal indulte al convencer al proveedor para que vuelva a Verisign, pero cuando vuelvan, 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 conocedores de la tecnología para usar el comando keytool y prefiero no programarlo, ya que eso 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.)

Imagino que keytool usa Java internamente. ¿Qué comando podría usar dentro de Java para replicar la funcionalidad de keytool e instalar el certificado raíz de forma programática?

Respuesta

2

No sé si eso es posible, pero podría implementar su propio TrustManager para permitir esta conexión o esta CA. Here son los conceptos básicos.

+0

Eso podría funcionar para nosotros. El enlace sugiere una forma de deshabilitar por completo la verificación, que no es exactamente lo que queremos, pero tal vez podría sustituir al TrustManager normal para que haga uno que intente con todos los certificados raíz más uno. Gracias, esto parece prometedor. –

0

Si desea instalar el certificado en el almacén de claves de la raíz de confianza en el equipo de escritorio, necesitará permiso para hacerlo. Es lo mismo con keytool, necesita una contraseña para acceder al almacén de claves de la raíz de confianza. Si quieres ser rápido-n-sucia, puede

  • escribir el certificado a un archivo o un flujo de bytes o lo que sea
  • importación utilizando KeyTool clase (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.

+0

Es válido según Firefox e Internet Explorer. Java solo viene con su propio almacén de claves en lugar de usar el que proporciona el sistema operativo, y supongo que la versión de Java no incluye los últimos interesados ​​en el mercado de SSL. –

+0

Existen casos en los que esto es razonable: en nuestra empresa, usamos nuestra propia CA internamente; naturalmente, no es de confianza por defecto (se queja el navegador, etc.). Importar este certificado de CA es mucho más fácil que agregar excepciones para certificados individuales en cualquier lugar. – sfussenegger

1

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

De hecho, si nos fijamos en la fuente de la clase KeyTool (paquete sun.security.tools), no solo es definitiva, también tiene un constructor privado que impide que quien llama cree una instancia de la clase KeyTool código. KeyTool tiene un método principal, lo que hace que la línea de comandos (y, por lo tanto, un usuario del sistema operativo) posiblemente sea la única manera en que uno puede inicializar y comunicarse con KeyTool.

El único (simplista) se acerca a la izquierda sería:

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

Para el nivel técnico de nuestros usuarios, la instalación automática sin preguntas es la única opción que nos ahorraría el tipo de preguntas de soporte "su aplicación está rota, corrige". –

+0

En cuanto a la cuestión filosófica de si se debe permitir que las aplicaciones modifiquen el almacén de claves, la respuesta debe ser, por supuesto, de lo contrario, la herramienta de claves no podría funcionar. El acceso a la operación podría ser controlado por un gerente de seguridad, tal vez. Por desgracia, estoy divagando. Las decisiones de diseño detrás de esto no importan tanto como la búsqueda de una solución práctica. Gracias por los indicadores de cualquier manera. –

+3

Había olvidado mencionar otra alternativa: usar tu propia tienda de confianza que podría contener todas las CA raíz que deseas. Puede hacer que la JVM use esa tienda de confianza a través de la propiedad javax.net.ssl.trustStore. –

1

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

0

Command-line solution. En la Mac, la casa de Java es/Library/Java/Home. Proveedores:

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

NombreCA Sustituto con el nombre de la entidad emisora, y ca.crt con una ruta de acceso al archivo de certificado (PEM funciona). Pedirá 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 cert de CA de RapidSSL.

+0

Creo que mi parte favorita fue donde dijo que quería hacerlo sin usar keytool y le dijo que usara keytool;) –

+0

Es cierto. Pero no puedo imaginarme escribiendo un Java TrustManager y, de alguna manera, distribuir esa aplicación es más fácil que una solución con scripts utilizando keytool, incluso en un entorno mixto. – farcepest

0

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

jssecacerts

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

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

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

Cuestiones relacionadas