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 deshacerse de un certificado sin procesar, 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 te importa)
-CApath /etc/ssl/certs/
Pero obtén el mismo error.
Esta fuente dice que puedo usar esa bandera de CApath pero no parece ayudar. Intenté múltiples caminos en vano.
Por favor, hágame saber a dónde voy mal.
fuente
echo "" | openssl s_client -connect server:port -prexit 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p'
stackoverflow.com/a/12918442/843000echo | openssl s_client -connect server:port 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cert.pem
sed
conopenssl x509
, y leerlo usando un sub-shell:openssl x509 -in <(openssl s_client -connect server:port -prexit 2>/dev/null)
echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509
Si bien estoy de acuerdo con la respuesta de Ari (y la voté :), tuve que hacer un paso adicional para que funcione con Java en Windows (donde debía implementarse):
Antes de agregar la
openssl x509 -outform DER
conversión, recibí un error de keytool en Windows quejándose del formato del certificado. Importar el archivo .der funcionó bien.fuente
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 autenticación del cliente, y el shakshake necesitaba más información para continuar a la etapa donde se arrojaron los certificados.
Aquí está mi comando de trabajo:
Esperemos que esto sea un empujón en la dirección correcta para cualquiera que pueda obtener más información.
fuente
Una línea para extraer el certificado de un servidor remoto en formato PEM, esta vez usando
sed
:fuente
-servername
opción, no sé por qué, pero tuve que usarlo para obtener el certificado completo.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 admite SNI, lo cual es importante si está trabajando con un servidor HTTP es:
La opción -servername es habilitar la compatibilidad con SNI y el openssl x509 -text imprime el certificado en formato legible para humanos.
fuente
Para obtener el certificado de servidor remoto, puede usar la
openssl
herramienta y puede encontrarla entreBEGIN CERTIFICATE
yEND CERTIFICATE
el que tiene que copiar y pegar en el archivo de certificado (CRT).Aquí está el comando que lo demuestra:
Para devolver todos los certificados de la cadena, simplemente agregue
g
(global) como:Luego, simplemente puede importar su archivo de certificado (
file.crt
) en su llavero y hacer que sea confiable, para que Java no se queje.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 hágalo siempre Trust for SSL .
En CentOS 5 puede agregarlos a un
/etc/pki/tls/certs/ca-bundle.crt
archivo (y ejecutarsudo update-ca-trust force-enable
:), o en CentOS 6 copiarlos/etc/pki/ca-trust/source/anchors/
y ejecutarlossudo update-ca-trust extract
.En Ubuntu, cópielos
/usr/local/share/ca-certificates
y ejecútelossudo update-ca-certificates
.fuente
fuente
para imprimir solo la cadena de certificados y no el certificado del servidor:
actualizar CA trust en CentOS / RHEL 6/7:
en CentOS / RHEL 5:
fuente
Puede obtener y almacenar el certificado raíz del servidor utilizando el siguiente script bash:
Simplemente sobrescriba las variables requeridas.
fuente
Si su servidor es un servidor de correo electrónico (MS Exchange o Zimbra), tal vez necesite agregar las banderas
starttls
ysmtp
:openssl s_client -starttls smtp -connect HOST_EMAIL:SECURE_PORT 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > CERTIFICATE_NAME.pem
Dónde,
HOST_EMAIL es el dominio del servidor, por ejemplo, mail-server.com.
SECURE_PORT es el puerto de comunicación, por ejemplo, 587 o 465
Nombre de archivo de salida de CERTIFICATE_NAME (formato BASE 64 / PEM)
fuente
Para el beneficio de otros como yo que intentaron seguir los buenos consejos aquí al acceder a AWS CloudFront pero fallaron, el truco es agregar
-servername domain.name..
.Fuente: https://serverfault.com/a/780450/8972
fuente