usar instalar cuenta crear como certificado linux security certificate openssl ssl-certificate

linux - instalar - Usando openssl para obtener el certificado de un servidor



openssl csr (10)

Estoy tratando de obtener el certificado de un servidor remoto, que luego puedo usar para agregar a mi almacén de claves y usar dentro de mi aplicación java.

Un desarrollador senior (que está de vacaciones :() me informó que puedo ejecutar esto:

openssl s_client -connect host.host:9999

Para obtener un certificado sin procesar descargado, que luego puedo copiar y exportar. Recibo el siguiente resultado:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA verify error:num=19:self signed certificate in certificate chain verify return:0 23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40 23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

También he probado con esta opción.

-showcerts

y este (corriendo en debian mind you)

-CApath /etc/ssl/certs/

Pero consigue el mismo error.

Esta fuente dice que puedo usar ese indicador CApath pero no parece ayudar. He intentado múltiples caminos en vano.

Por favor, hágame saber a dónde me voy mal.


Con SNI

Si el servidor remoto está utilizando SNI (es decir, compartiendo 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 utiliza SNI, puede omitir el parámetro -servername :

openssl s_client -showcerts -connect www.example.com:443 </dev/null


Para ver los detalles completos del certificado de un sitio, también puede utilizar esta cadena de comandos:

$ echo | / openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | / openssl x509 -text


La línea de comando más fácil para esto, que incluye la salida PEM para agregarla al almacén de claves, así como una salida legible por humanos y también es compatible con SNI, lo que es importante si está trabajando con un servidor HTTP es:

openssl s_client -servername example.com -connect example.com:443 / </dev/null 2>/dev/null | openssl x509 -text

La opción -servername es habilitar el soporte de SNI y openssl x509 -text imprime el certificado en formato legible por humanos.



Para obtener el certificado del servidor remoto, puede utilizar la herramienta openssl y puede encontrarlo entre BEGIN CERTIFICATE y END CERTIFICATE que debe copiar y pegar en su archivo de certificado (CRT).

Aquí está el comando que lo demuestra:

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

Para devolver todos los certificados de la cadena, solo agregue g (global) como:

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

Luego, simplemente puede importar su archivo de certificado ( file.crt ) a su llavero y hacerlo confiable, de modo que Java no debe quejarse.

En OS X, puede hacer doble clic en el archivo o arrastrar y soltar su Acceso a Llavero, para que aparezca en inicio de sesión / Certificados. Luego haga doble clic en el certificado importado y conviértalo en Confiar siempre para SSL .

En CentOS 5 puede /etc/pki/tls/certs/ca-bundle.crt archivo /etc/pki/tls/certs/ca-bundle.crt (y ejecutar: sudo update-ca-trust force-enable ), o en CentOS 6, cópielos en /etc/pki/ca-trust/source/anchors/ y ejecuta sudo update-ca-trust extract .

En Ubuntu, cópielos en /usr/local/share/ca-certificates y ejecute sudo update-ca-certificates .


Puede obtener y almacenar el certificado raíz del servidor utilizando el siguiente script de bash:

CERTS=$(echo -n | openssl s_client -connect $HOST_NAME:$PORT -showcerts | sed -ne ''/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'') echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" ''NR > 1 { printf RS $0 > "''$SERVER_ROOT_CERTIFICATE''"; close("''$SERVER_ROOT_CERTIFICATE''") }''

Solo sobrescribe las variables requeridas.


Resulta que aquí hay más complejidad: necesitaba proporcionar muchos más detalles para que esto funcione. Creo que tiene algo que ver con el hecho de que es una conexión que necesita la autenticación del cliente, y que el hankshake necesitaba más información para continuar a la etapa en la que se descargaron 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 pueda hacer algo más de información.


Si bien estoy de acuerdo con la respuesta de Ari (y la vaticiné :), tuve que 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 la conversión openssl x509 -outform DER , recibí un error de keytool en Windows quejándose del formato del certificado. Importar el archivo .der funcionó bien.


Una sola 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''


para imprimir solo la cadena de certificados y no el certificado del servidor:

# MYHOST=myhost.com # MYPORT=443 # openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk ''/^.*''"${MYHOST}"''/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}''

para actualizar CA trust en CentOS / RHEL 6/7:

# update-ca-trust enable # openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk ''/^.*''"${MYHOST}"''/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'' >/etc/pki/ca-trust/source/anchors/myca.cert # update-ca-trust extract

en CentOS / RHEL 5:

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk ''/^.*''"${MYHOST}"''/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'' >>/etc/pki/tls/certs/ca-bundle.crt


HOST=gmail-pop.l.google.com PORT=995 openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem