2012-01-05 20 views
26

Estoy usando openssl para crear certificados autofirmados. Estoy recibiendo este error con los certs generé: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No hay nombres alternativos del sujeto presentescómo agregar el nombre alternativo del sujeto a certs ssl?

¿Alguien sabe cómo especificar "nombre alternativo del sujeto", mientras creando un certificado? Así es como yo estoy generando un almacén de claves:

sudo $JAVA_HOME/bin/keytool -genkey -dname "CN=192.168.x.xxx, OU=I, O=I, L=T, ST=On, C=CA" -alias tomcat -validity 3650 -keyalg RSA -keystore /root/.keystore -keypass abcd -storepass abcd 

para generar una clave:

openssl s_client -connect 192.168.x.xxx:8443 2>/dev/null 

Por favor, ayuda! ¡Gracias!

+0

posible duplicado de [? ¿Cómo se resuelven los nombres de servidor certificado SSL/¿Puedo añadir nombres alternativos utilizando herramienta de claves] (http://stackoverflow.com/questions/8443081/how-are-ssl-certificate-server-names-resolved-can-i-add-alternative-names -using) – Bruno

+0

@ Sapphire: No entiendo su problema. El nombre alternativo del sujeto es 'NO' una extensión requerida en el certificado X.509. Por lo tanto, si tiene un certificado sin él, no hay problema. Entonces, ¿cómo estás obteniendo esta excepción? – Cratylus

+0

@ user384706 ¿Puedes mirar esta pregunta? Incluso estoy confundido acerca de por qué está arrojando este error. [http://stackoverflow.com/questions/8759956/failed-to-create-service-exception-javax-xml-ws-webserviceexception/8760118#8760118] – Sapphire

Respuesta

37

Aunque this question fue más específicamente sobre direcciones IP en Tema Alt. Nombres, los comandos son similares (usando entradas DNS para un nombre de host y entradas IP para direcciones IP).

Para citar a mí mismo:

Si está utilizando keytool, a partir de Java 7, keytool tiene una opción para incluir un nombre alternativo del sujeto (véase la tabla en la documentación para -ext): se puede utilizar -ext san = DNS: www.example.com o -ext san = IP: 10.0.0.1

en cuenta que sólo necesita Java 7 de keytool de utilizar este comando. Una vez que haya preparado su almacén de claves, debería funcionar con versiones anteriores de Java.

(El resto de esta respuesta también menciona cómo hacer esto con OpenSSL, pero no parece ser lo que usted está utilizando.)

+0

No puedo cambiar a Java7. ¿Hay alguna manera de eludir la verificación de nombre secundario y alternativo en mi código Java? – Sapphire

+3

No evite este control. Como dije, solo necesitas Java 7 para usar este comando 'keytool'. Una vez hecho, deberías poder usar el archivo JKS con tu instalación Java 6 (o inferior) (ni siquiera tiene que estar en la misma máquina). Alternativamente, puede usar OpenSSL para generar este certificado (autofirmado) (los comandos y la configuración pueden ser un poco más complejos): puede convertir su clave PEM/cert generado con OpenSSL en un archivo '.p12' y usarlo directamente desde Java como un almacén de claves usando el almacén de claves escriba 'PKCS12'. También podría usar un nombre de host en lugar de un addr IP: se saldría con la CN. – Bruno

+0

Usé un nombre de host en su lugar, como sugirió, y obtuve esto: no se encontró ningún nombre que coincida con myhostname.com. – Sapphire

12

simultáneo de IP y DNS se pueden especificar con la herramienta de claves argumento adicional '-ext SAN = dns: abc.com, ip: 1.1.1.1'

Ejemplo: herramienta de claves -genkeypair -keystore almacén de claves opción -dname "CN = prueba, OU = Desconocido, O = Desconocido, L = Desconocido, ST = Desconocido, C = Desconocido "-keypass keypwd -storepass storepass -keyalg RSA -alias desconocidas -ext SAN = dns: test.abc.com, ip: 1.1.1.1

+3

Tenga en cuenta que el comando anterior ** no ** crea una CSR. La herramienta de claves de Java crea un par de llaves en forma de certificado autofirmado en el almacén de claves, y el atributo de SAN entra en ese certificado autofirmado. Si desea emitir un CSR con un atributo SAN, debe pasar el mismo argumento -ext a 'keytool -certreq'. Lo curioso es que la ayuda de autodocumentación de keytool ** ** no incluye la opción -ext, aunque keytool sí procesa -extremamente bien. – avarvit

+0

@avarvit esto significa que puedo agregar altNames en la CSR, incluso si no se utilizan invocando '-genkeypair'. ¿Qué pasaría al recibir un certificado de la CA con este CSR? Woule keytool ¿importarlo y vincularlo a la clave privada correcta? ¿Es esta una forma posible de agregar altName a los certificados que lo perdieron? – eppesuig

+0

Gracias por agregar un ejemplo completo – Tom

3

Al generar CSR es posible especificar -ext atributo de nuevo para que se lo coloquen en el CSR

keytool -certreq -file test.csr -keystore test.jks -alias testAlias -ext SAN=dns:test.example.com 

ejemplo completo aquí: How to create CSR with SANs using keytool

Cuestiones relacionadas