Si bien estoy de acuerdo con la respuesta de Ari (y la voté a favor :), necesitaba hacer un paso adicional para que funcionara con Java en Windows (donde debía implementarse):
openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der
Antes de agregar el openssl x509 -outform DER
conversión, recibí un error de keytool en Windows quejándose del formato del certificado. La importación del archivo .der funcionó bien.
Resulta que aquí hay más complejidad:necesitaba proporcionar muchos más detalles para poner esto en marcha. Creo que tiene algo que ver con el hecho de que es una conexión que necesita la autenticación del cliente, y el protocolo de enlace necesitaba más información para continuar con la etapa en la que se volcaron los certificados.
Aquí está mi comando de trabajo:
openssl s_client -connect host:port -key our_private_key.pem -showcerts \
-cert our_server-signed_cert.pem
Esperemos que esto sea un empujón en la dirección correcta para cualquiera que necesite más información.
Una línea para extraer el certificado de un servidor remoto en formato PEM, esta vez usando sed
:
openssl s_client -connect www.google.com:443 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
Con SNI
Si el servidor remoto usa SNI (es decir, comparte varios hosts SSL en una sola dirección IP), deberá enviar el nombre de host correcto para obtener el certificado correcto.
openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null
Sin SNI
Si el servidor remoto no usa SNI, puede omitir -servername
parámetro:
openssl s_client -showcerts -connect www.example.com:443 </dev/null
Para ver los detalles completos del certificado de un sitio, también puede usar esta cadena de comandos:
$ echo | \
openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
openssl x509 -text