Con el auge de las vulnerabilidades en TLS/SSL este último tiempo, tuvimos que ir ajustando el listado de ciphers varias veces, ya que los requerimientos son cada vez más exigentes. El problema es la compatibilidad con sistemas operativos/browsers más antiguos, que no soportan las versiones más nuevas de TLS (TLS 1.2) o ciphers más seguros.
Hoy les traigo algo que me sirvió mucho, que es listar los ciphers soportados por un servidor usando un simple script en bash que se basa en openssl. Si bien hay varias tools que hacen esta tarea, siendo la que más uso TestSSLServer, quería algo que pudiera ejecutar desde cualquier lugar, sin depender de tools externas o la instalación de java. OpensSSL está presente en toda las distribuciones, así que no necesitamos nada extra para correr este script.
El core del script lo encontré en este post de superuser, al cual le hice modificaciones para que OpenSSL use SNI, tenga un check básico de parámetros, permita pasar port por parámetro y reporte sólo los ciphers con resultado positivo. Sería un equivalente de TestSSLServer más básico, pero portable :D
#!/bin/bash -e if [ "$1" == "" ]; then echo "usage: $0[port]" exit fi if [ "$2" == "" ]; then PORT=443 else PORT=$2 fi # OpenSSL requires the port number. SERVER=$1:$PORT DELAY=1 ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g') echo -n "Checking if server is up... " result=$(echo -n | openssl s_client -connect $SERVER 2>&1) if [[ "$result" =~ "Connection timed out" ]]; then echo "FAIL - connection time out" exit 1 fi echo "OK" echo "Obtaining cipher list from $(openssl version)." for cipher in ${ciphers[@]}; do result=$(echo -n | openssl s_client -cipher "$cipher" -servername $SERVER -connect $SERVER 2>&1 || echo "") if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher :" ]] ; then echo $cipher fi sleep $DELAY done