Verificando certificados SSL desde la línea de comandos

Recientemente he necesitado revisar el vencimiento de certificados SSL mediante un script que me permitiera conocer el estado de los mismos en muchos servidores.

Una primer opción era ejecutar el comando openssl para verificar cada certificado:

$ openssl x509 -in certificado.pem -noout -enddate
notAfter=Oct 24 23:59:59 2014 GMT

y automatizarlo mediante conexiones ssh, pero el problema es que los certificados no tienen todos el mismo nombre, ni están instalados en el mismo directorio, pues algunos fueron instalados dependiendo del servicio.

Así que la opción fue utilizar openssl para abrir conexiones como cliente y verificar qué vencimiento tiene el certificado del servicio correspondiente:

$ echo | openssl s_client -connect servidor.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Oct 24 00:00:00 2013 GMT
notAfter=Oct 24 23:59:59 2014 GMT

El echo inicial envía un enter al comando openssl para que el cliente no conectado y de esta forma con un listado de nombres de servidor y los puertos, se puede revisar toda una infraestructura de servidores y servicios.

Algunas argumentos que pueden ser pasados a openssl para obtener datos de certificados X509:

  • –dates fechas del período de validez del certificado
  • –enddate fecha de vencimiento
  • –subject titular del certificado y CN
  • –issuer autoridad de certificación
  • –fingerprint huella dactilar del certificado
  • –text toda la información del certificado

Estos comandos pueden ser utilizados en conjunto para obtener más de una información en la misma consulta:

$ echo | openssl s_client -connect servidor.com:443 2>/dev/null | openssl x509 -noout -dates -issuer -fingerprint
notBefore=Oct 24 00:00:00 2013 GMT
notAfter=Oct 24 23:59:59 2014 GMT
issuer= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=EssentialSSL CA
SHA1 Fingerprint=6F:24:52:8F:10:E0:6D:AB:C9:BB:1D:52:65:F6:A8:47:89:BE:A3:5F

y quitando el -noout se obtiene el certificado:

$ echo | openssl s_client -connect servidor.com:443 2>/dev/null | openssl x509
-----BEGIN CERTIFICATE-----
MIIFIjCCBAqgAwIBAgIQMK1wptvY36IzHyscziufKTANBgkqhkiG9w0BAQUFADBy
MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
...
nZpAVhzwHIS5wzMMHc5XRFvv3Ohnsco1CAA76HBBrMjmC6OYFXVDX+LgXjnTvuS8
lpg865wT5NUeWtWoRCOQydIHXqatpEyysbBZ/QbUA9CjjWViowRfYub2jZJ3v1k4
SsEYTJTsv3duHmn5Zn+dhINdVgVEJA==
-----END CERTIFICATE-----

y, por supuesto, para la consulta de un solo certificado, a veces es útil alguna herramienta web como esta de SSLShopper

Con curl


$ curl -s --insecure -v https://servidor.com \
| awk 'BEGIN { cert=0 } /^\* Server certificate:/ \
{ cert=1 } /^\*/ { if (cert) print }'

* Rebuilt URL to: https://servidor.com/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 13.249.87.93...
* TCP_NODELAY set
* Connected to servidor.com (x.x.x.x) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
} [5 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.2 (IN), TLS handshake, Server hello (2):
{ [76 bytes data]

...

* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use http/1.1
* Server certificate:
* subject: CN=servidor.com
* start date: Aug 16 00:00:00 2019 GMT
* expire date: Sep 16 12:00:00 2020 GMT
* issuer: C=US; O=Amazon; OU=Server CA 1B; CN=Amazon
* SSL certificate verify ok.
} [5 bytes data]
> GET / HTTP/1.1
> Host: servidor.com
> User-Agent: curl/7.52.1
> Accept: */*
>

El cocinero, la aplicación test_tomasb, el hashtag #PedroEducacion y su su amante

Hace unos días escuché un analista comentando que «los políticos» activos en redes sociales eran precisamente los que no llevan la delantera en las encuestas, mientras que los que si la llevan ni siquiera aparecen (como que las ignoran).

Las redes sociales son un arma de doble filo y hoy la cuenta de twitter de @PedroBordaberry tuvo una muestra de este poder de las redes sociales, con el hastag #PedroEducacion.

En particular, aparecieron una serie de usuarias, todas utilizando la aplicación test_tomasb para incluir comentarios con el hashtag en cuestión. La coincidencia no fue solo esa: todas las usuarias con bonitas fotos de perfil, con apellidos extranjeros (o poco comunes en nuestro medio) como Marlow, Mccarter, Isaacson, Heck, etc., con menos de 10 twist realizados hoy y todas apoyando o difundiendo las ideas políticas identificadas con el hastag.

 

No me interesa discutir o sugerir que ha sido un acto de promoción que salió mal o un ataque con interés de desprestigiar. Es una maniobra muy evidente, pero de los errores se aprende y este tipo de actos serán más sutiles en el futuro. Me interesa quedarme con la algunas cosas que considero esenciales:

  1. Fue realizado por una sola persona con conocimientos de programación, lo que demuestra lo fácil de afectar o influir en redes sociales.
  2. Participando corres peligro y en cualquier momento un anónimo con tiempo e inteligencia puede darte un dolor de cabeza con usos no previstos.
  3. Y, casi es obvio pero hay que repetirlo, no se puede confiar en los 15.000 «me gusta» ni en los 33.391 «amigos» te siguen.

.

screen básico para sesiones remotas

En forma simple, screen es un software que nos permite con una sola conexión remota a un servidor crear múltiples sesiones de terminal, con la ventaja de poder desacoplarnos de los programas en ejecución para que sigan corriendo en segundo plano e inclusive poder cerrar la conexión sin que se interrumpan los programas en ejecución dentro de screen.

Screen no suele venir pre-instalado en las distribuciones de Linux, pero está disponible en los repositorios de software.

Uso simple

$ screen

Dentro de screen ejecutamos el programa que necesitemos, por ejemplo ping a un server y lo dejamos corriendo. Nos desacoplamos utilizando Ctrl-a Ctrl-d y volvemos en la terminal desde donde llamamos a screen. Ahora podemos cerrar la conexión si necesitamos, el ping seguirá corriendo.

Para volver a entrar al screen que está corriendo y tener nuevamente el control del ping ejecutamos

$ screen -r

Comandos útiles de screen

Los comandos de screen, una vez que estamos dentro, todos comienzan con Ctrl-a y estos son los más usados:

Ctrl-a ? Ayuda y sumario de funciones
Ctrl-a c Crear una nueva terminal
Ctrl-a Ctrl-n o Ctrl-a Ctrl-p   Cambiar a la Siguiente o Anterior terminal
Ctrl-a Ctrl-N Cambiar a la Siguiente o Anterior terminal (siendo N [0-9])
Ctrl-a ” Lista navegable de terminales en funcionamiento
Ctrl-a a Limpiar un Ctrl-a pulsado por error
Ctrl-a Ctrl-d Desacoplar de screen y dejar la sesión en funcionamiento
Ctrl-a x Bloquear todas las terminales con una clave

Obviamente, screen también puede ser utilizado en forma local, para cualquier tarea que demore o cuando no queremos dejar una ventana abierta para ella. Un uso que para mi es obligatorio, es cuando realizo la actualización de un servidor, pues si mi conexión se corta (o rota mi IP de origen) mi proceso de actualización continuará dentro de screen y podré volver a tomar su control.

Fotos favoritas de Tumblr en tu Dropbox

Me gustó la idea de integrar mediante IFTTT las fotos que marco como favoritas en Tumblr para que sean automáticamente descargadas a una carpeta Dropbox.

if tumblr then dropbox

Encuentro una receta IFTTT ya hecha por el usuario motyar que utiliza un script PHP de su creación, según él mismo lo detalla en su blog «Hacking IFTTT».

El código de Motyar retorna el cabezal Location con la URL de la foto para que la aplicación la descargue para poner en Dropbox. En mis pruebas tuve algunos problemas pues IFTTT no seguía la re-dirección y la foto nunca llegaba a ser descargada; así que implementé algunas modificaciones para que el código PHP devolviera la foto misma.

Obviamente el código puede ser utilizado para otros fines, además de IFTTT. Espero sea de utilidad para quién quiera usarlo, el siguiente es el repositorio en GitHub:

https://github.com/pilasguru/tumblr-photo-url

Para usarla en IFTTT basta con incorporar la receta que comparte Motyar, subir el archivo tumblr2.php desde github su sitio web y cambiar el nombre del php en el campo «File URL» de la receta.