Pregunta ¿Cómo descargar el certificado ssl desde un sitio web?


Quiero descargar el certificado ssl de, digamos https://www.google.com, utilizando wget o cualquier otro comando. ¿Alguna línea de comando de Unix? wget o openssl?


162
2018-05-07 21:01


origen




Respuestas:


Para descargar el certificado, debe usar el cliente integrado en openssl así:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

Eso guardará el certificado para /tmp/$SERVERNAME.cert.

Puedes usar -showcerts Si quieres descargar todos los certificados de la cadena. Pero si solo desea descargar el certificado del servidor, no es necesario especificar -showcerts

echo -n Da una respuesta al servidor, para que se libere la conexión.

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' elimina información sobre la cadena de certificados y los detalles de conexión. Este es el formato preferido para importar el certificado en otros almacenes de claves.


219
2017-10-19 22:59



Aprecie que no solo dio una buena respuesta, sino también una explicación precisa. - marco.m
Hace -showcerts mostrar el servidor / hoja cert también? Pensé que solo mostraba intermedios cuando se incluía ese interruptor. - Mike B
Como decía la respuesta, s_client siempre muestra el certificado del servidor (si lo hay, es decir, el servidor responde a hola y no elige una suite anónima). -showcerts muestra todos Los certificados recibidos, el servidor cert primero y luego los intermedios y / o root. - dave_thompson_085
Sin embargo, esto no funciona en las presencias de un proxy. - Frederick Nord
Esto tampoco funciona con servidores que utilizan SNI (varios certificados / dominios en una sola dirección IP). Para evitar problemas, especifique el parámetro servername de openssl: openssl s_client -connect HOST: PORTNUMBER -servername CN - verhage


Encontré la respuesta. Openssl lo proporciona.

openssl s_client -connect $ {REMHOST}: $ {REMPORT}


54
2018-05-07 21:05



además openssl x509 -text <<EOF cert-text EOF Ver detalles del certificado. - mpapis
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pem cortesía de serverfault.com/questions/139728/… - pulkitsinghal
esta logra lo mismo y se salta el sed cortar. - phs
Esto solo verifica un certificado, ¿qué sucede si el servicio forma parte de un grupo de servidores de carga equilibrada, de los cuales cada uno tiene un certificado diferente, posiblemente firmado por una CA raíz diferente? O, en otras palabras, un ataque mitm puede permitir que esta solicitud se dirija al sitio real y luego dirija otras solicitudes a sus servidores. ¿Hay alguna manera de comprobar esto? ¿Y para obtener una lista de todos los certificados que realmente tiene un dominio? - Jens Timmerman
@JensTimmerman "O en otras palabras, un ataque mitm podría permitir que esta solicitud se dirija al sitio real y luego dirigir otras solicitudes a sus servidores". Eso no es posible a menos que el hombre en el medio tenga un certificado válido para el servidor de destino (o el cliente sea tonto, no verifique el certificado del servidor). Evidentemente, si el servidor a veces ofrece un certificado diferente, solo puede esperar obtenerlos todos al repetir los intentos de conexión. - David Tonhofer


los GNUTLS herramienta de cliente, gnutls-cli, también puede hacer esto fácil:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

El programa está diseñado para proporcionar un cliente interactivo al sitio, por lo que necesita darle una entrada vacía (en este ejemplo, de /dev/null) para finalizar la sesión interactiva.


20
2017-10-07 06:19



¿Cómo haría que gnutls se conecte a través del proxy https (configurado en todo el sistema) e imprima el certificado que intercambia? - Frederick Nord


basado en la respuesta de @bignose, aquí hay una versión autocontenida que se adapta bien, por ejemplo, a una receta de chef:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates

8
2018-05-27 09:31





true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

este modo de openssl espera stdin, por lo que lo proporcionamos a través de true |, esto se conecta al servidor especificado en el parámetro -connect. 2>/dev/null errores de silencio (opcional), podemos pasar la salida completa al analizador x509, especificando /dev/stdin para utilizar el tubo de shell como el archivo de entrada. Y eso producirá sólo el -----BEGIN CERTIFICATE----- a -----END CERTIFICATE----- parte de la s_client salida. Puede redirigir eso a un archivo agregando > google.com.pem hasta el final del comando.


Lo mejor que puedo decir, esto no verifica la cadena de certificados, solo puede decirle qué identidad SSL proporciona el servidor final.


6
2018-01-12 10:38



(1) esto realmente no mejora las respuestas de hace 6 años (2) x509 lee stdin por defecto por lo -in /dev/stdin es redundante (3) s_client verifica que el servidor cert se encadene correctamente a un ancla de confianza local (raíz) y no haya caducado, pero ha suprimido la información que mostraría que (4) NO verifica la revocación (5) verifica la nombre en el servidor cert solo en 1.0.2 y luego no por defecto (pero puede verificarlo usted mismo mirando el certificado más adelante) - dave_thompson_085
@ dave_thompson_085, la pregunta es cómo descargar el certificado, pero no mostrar información de la cadena. Me gusta el openssl x509 mucho mejor que sed en otra respuesta. - Der_Meister


Sintaxis alternativa utilizando Ex y sustitución de procesos:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt

0