Determine si un servidor está solicitando un certificado de cliente usando openssl s_client

6

Estoy usando openssl para conectarme a los servidores para detectar si requieren un certificado de cliente.

Actualmente estoy usando este comando:

openssl s_client -connect pokyloky.com:5222 -state 2>&1 | grep 'server certificate request' 

SSL_connect:SSLv3 read server certificate request A

Me sorprende que simplemente utilizando:

openssl s_client -connect pokyloky.com:5222 

no indica directamente que se haya solicitado un certificado de cliente. Hay un error de apretón de manos:

139843101763232:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1262:SSL alert number 40
139843101763232:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:

Pero no establece explícitamente por qué ha fallado el apretón de manos.

¿Por qué openssl s_connect no indica claramente que el servidor solicitó un certificado y el protocolo de enlace ha fallado debido a esto?

    
pregunta Cybergibbons 30.09.2015 - 11:51
fuente

2 respuestas

3

Ese comportamiento no es parte de TLS v1.2

  

Pero no establece explícitamente por qué ha fallado el apretón de manos.

No puede. No está definido como parte del protocolo (TLS v1.2).

Cuando el servidor o cliente decide abortar una conexión, pueden elegir entre uno de varios mensajes alert .

Un mensaje Alert tiene este aspecto :

struct {
      AlertLevel level;
      AlertDescription description;
} Alert;

AlertLevel tiene un byte de ancho y solo tiene dos estados:

enum { warning(1), fatal(2), (255) } AlertLevel;

Y AlertDescription también tiene un byte de ancho. Pero de los 256 códigos de razón posibles, solo unos 30 son asignados y utilizados . Y de estos 30, simplemente no hay ninguno, que se ajuste al "Oye, te dije que quería un certificado de cliente, ¿por qué no me diste uno?!?" -bill.

(Y aunque parece que podría encajar, no_certificate_RESERVED(41) se usó para otra cosa. A saber, en SSLv3.0 se usó para la otra dirección: para que el CLIENTE le diga al servidor "Lo siento, puedo no le damos un certificado de cliente ". )

Ahora, para la pregunta más profunda "¿No tendría sentido definir un código de razón de este tipo si quedan muchos puntos de código no utilizados? En lugar de un error difícil, en gran medida inexplicable" , mi respuesta es simplemente: "No lo sé".

No veo cómo tener tal alerta podría debilitar el protocolo, pero el cifrado es complicado, y no estoy seguro.

Loadbalancer para dar un mensaje de error amigable

¿Pero qué pasa si quieres dar un mensaje de error amigable?

AFAIK, entonces usted debe hacer cosas un tanto complicadas con la lógica de equilibrio de carga y, inicialmente, permitir la conexión sin cliente, pero luego redirigir inmediatamente a una página de error. Apache puede hacer tal cosa con una regla similar a esta :

RewriteCond %{SSL:SSL_CLIENT_VERIFY} !^SUCCESS$
RewriteRule .* /help/ssl-client-auth-required.html [L]

IIS define un mensaje de error HTTP llamado 403.7 Forbidden: Client Certificate Required . Creo que este es un movimiento inteligente (mejor que simplemente fallar, al menos), aunque el .7 de 403.7 no es estándar y creo que el mensaje de error pertenece a la capa TLS y no a la capa HTTP.

    
respondido por el StackzOfZtuff 29.11.2015 - 15:20
fuente
1

Puede ver el resultado detallado del protocolo agregando la marca -trace . La documentación indica que:

  

-trace

show verbose trace output of protocol messages. OpenSSL needs to be compiled with enable-ssl-trace for this option to work.

Por supuesto, puede usar las marcas -state , -debug y -msg para recuperar información extensa sobre cómo funciona el protocolo seleccionado. Funciona tan bien como los estados en los que openssl pasa:

  

-estado

prints out the SSL session states.
     

-debug

print extensive debugging information including a hex dump of all traffic.
     

-msg

show all protocol messages with hex dump.
    
respondido por el Sebi 30.09.2015 - 13:11
fuente

Lea otras preguntas en las etiquetas