2010-01-13 22 views
19

Se produjo otro problema al utilizar SSL y Tomcat: configuré un almacén de claves que contiene una clave y un certificado (el certificado del servidor que deseo presentar a los clientes que se conectan al sitio). He hecho lo mismo para el almacén de confianza (voy a necesitar autenticación de cliente).Certificado de almacén de claves Tomcat HTTPS

El problema que tengo ahora es que cuando me conecto a mi instancia de Tomcat a través de HTTPS, el certificado presentado a mí (el certificado del servidor) no es mi certificado de servidor real, sino más bien la clave en el almacén de claves JKS. El uso de -Djavax.net.debug = ssl revela que presenta la CA correcta para la autenticación del cliente, pero no el certificado del servidor correcto.

adding as trusted cert: 
    Subject: CN=A 
    Issuer: CN=A 
    Algorithm: RSA; Serial number: - 
    Valid from Tue Nov 10 14:48:31 CET 2009 until Mon Feb 08 14:48:31 CET 2010 

adding as trusted cert: 
    Subject: X 
    Issuer: X 
    Algorithm: RSA; Serial number: - 
    Valid from Wed Jan 19 01:00:00 CET 2005 until Mon Jan 19 00:59:59 CET 2015

He reemplazado los valores reales con marcadores de posición. A = el nombre de dominio del servidor (pero en este caso, por alguna razón, esta es la clave y no el certificado). X = a VeriSign CA (esto debería ser correcto). Tengo un certificado existente que me gustaría usar para presentar a los clientes, que importé en un almacén de claves JKS utilizando keytool.

La configuración del conector Tomcat:

 
Connector port="444" protocol="HTTP/1.1" SSLEnabled="true" 
maxThreads="150" scheme="https" secure="true" 
clientAuth="false" sslProtocol="TLS"  
keystoreFile="conf/ssl/keystore.jks" 
keystorePass="xx" 
keyAlias="testkey" 
truststoreFile="conf/ssl/truststore.jks" 
truststorePass="xx"

Alguna idea de por qué mi instancia de Tomcat no presenta el certificado correcto?

+0

dar la configuración del conector ssl (del servidor.xml) – Bozho

Respuesta

15

El problema es (aparentemente - Realmente no puedo confirmar esto) que es imposible importar correctamente un certificado generado anteriormente (y la clave correspondiente) en un almacén de claves JKS y que Tomcat lo presente adecuadamente.

La situación en la que se produjo mi problema es el siguiente:

  1. Tengo un archivo de certificado, que me genera a mí mismo usando OpenSSL desde cero (tecla + RSE -> certificado), firmado por mi propia CA.
  2. Deseo configurar Tomcat para que presente este certificado particular a los usuarios que se conectan a mi sitio.

La solución que encontré para trabajar es:

  1. convertir el certificado existente y su clave privada para el formato DER.Por ejemplo (usando OpenSSL):

    Para clave privada;

    openssl pkcs8 -topk8 -nocrypt -in my_private_key.key -inform PEM -out my_private_key.der -outform DER

    Para el actual certificado firmado;

    openssl x509 -in my_certificate.crt -inform PEM -out my_certificate.der -outform DER

  2. importación ambos archivos DER en una presentación (archivo de almacén de claves JKS) usando una clase Java personalizada.

    java ImportKey my_private_key.der my_certificate.der

    yo no resolver esto a mí mismo (todo el mérito es el inventor original (s)). La fuente de esta clase de Java, y algunos más detalles se pueden encontrar here y here. Modifiqué esta clase ligeramente para que haya un 3er (o 4to) parámetro que especifique la ubicación de salida del archivo JKS resultante.

El resultado final es un almacén de claves JKS que luego se puede utilizar en la configuración del conector Tomcat como almacén de claves. La herramienta anterior generará el archivo JKS con contraseñas predeterminadas para la clave y el archivo JKS en sí, estos pueden ser cambiados más tarde usando keytool -storepasswd y keytool -keypasswd. Espero que esto ayude a las personas que enfrentan el mismo problema.

+2

+1. El segundo enlace (agentbob.info) funcionó para mí. Emite una contraseña para el almacén de claves que no tiene el primer enlace (comu.de). A la herramienta de claves de Java no le gusta cambiar la contraseña de un almacén de claves que no tiene contraseña. Además, puede especificar el alias clave que espera tomcat (es 'tomcat'). – Wolfgang

3

Su configuración debería funcionar correctamente.

Tomcat's how-to explica los pasos a seguir para tener un JKS correcto.

Asegúrese de que haya importado el certificado a la JKS, con el alias apropiado (TestKey)

+0

Cuando configuro las alias clave del certificado en el almacén de claves, Tomcat no se iniciará correctamente. Supongo que los parámetros keyAlias ​​se usan para especificar la clave, no el certificado. Tengo la sensación de que Tomcat nunca presentará correctamente mi certificado, ya que se creó por separado. En este momento voy a tratar de generar un nuevo certificado desde cero utilizando keytool en lugar de openssl, y ver si eso hace la diferencia. – tmbrggmn

+1

sí, intenta eso. La clave y el certificado, como se puede ver en el tutorial de Tomcat, deben estar bajo el mismo alias. – Bozho

+0

Mi intento anterior falló. Estoy haciendo algo mal, pero no sé qué. ¿Es posible presentar un certificado existente, o debe usar keytool para generar uno nuevo? Esto es confuso. – tmbrggmn

2

Ampliando comentario @Bozho,

Esto fue realmente crítico. "La clave y el certificado comprado deben estar bajo el mismo alias".

El certificado SSL comprado de CA (Verisign, Digicert, etc.) debe importarse con el mismo alias que la clave privada generada antes de crear el csr. Después de importar el certificado comprado en el almacén de claves utilizando java keytool, verá "Respuesta del certificado agregada al almacén de claves".

Para verificar la cadena de confianza, use el comando de terminal openssl s_client -connect yourdomain.com:443 -showcerts. Comienza en su certificado y lo conduce a una CA raíz de confianza.

Cuestiones relacionadas