Mediante terminal.
ssh-keyscan -p 22 dominio.com > /tmp/rsa && ssh-keygen -lf /tmp/rsa
Servicio online CheckSSL: https://checkssh.com
Código PHP de CheckSSL: https://checkssh.com/result/indexdotphp.txt
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Check SSH - Result</title> </head> <body style="font-family:courier;"> <?php function DoesItHaveInvalidChar($text) { //http://www.askingbox.com/tip/php-permit-only-certain-letters-numbers-and-characters-in-a-string //http://www.regular-expressions.info/characters.html //http://stackoverflow.com/questions/9589074/regex-should-hyphens-be-escaped if (!preg_match("#^[-a-zA-Z0-9\.:]+$#", $text)) { return TRUE;//echo 'String also contains other characters.'; } return FALSE; } function ExecuteCommand($h,$p) { $h = escapeshellcmd($h);//Just to be safe ... http://php.net/manual/en/function.escapeshellcmd.php $h = escapeshellarg($h);//Yeah, paranoid ... http://php.net/manual/en/function.escapeshellarg.php $p = escapeshellcmd($p); $p = escapeshellarg($p); //echo $h."<br>"; //echo $p."<br>"; $f = tempnam('','CS');//http://php.net/manual/en/function.tempnam.php //echo $f."<br>"; shell_exec("ssh-keyscan -p ".$p." ".$h." > ".$f); $r=shell_exec("ssh-keygen -l -f ".$f." 2>&1"); //http://www.linuxweblog.com/blogs/sandip/20090101/verifying-ssh-key-fingerprint unlink($f); $pieces = explode(" ", $r);//http://php.net/manual/en/function.explode.php if(count($pieces)==4)//http://php.net/manual/en/function.count.php { echo $pieces[1]; } else { echo "ERROR: Failed to get fingerprint."; } } if(isset($_POST["host"])) { $h=$_POST["host"]; $h_length=strlen($h); if(($h_length>=1)&&($h_length<=1024)) { if(DoesItHaveInvalidChar($h)) { echo "ERROR: Host contains invalid character."; } elseif(substr($h,0,1)=="-")//http://php.net/manual/en/control-structures.elseif.php //http://php.net/manual/en/function.substr.php { echo "ERROR: The first character of host is \"-\"."; } else { $p = 22; if(isset($_POST["port"])) { if(intval($_POST["port"])>0)//http://php.net/manual/en/function.intval.php { $p = intval($_POST["port"]); } } ExecuteCommand($h,$p); } } else echo "ERROR: String length of host is not between 1 and 1024."; } else echo "ERROR: Host is not set."; ?> <br><a href="../" style="font-family:arial;">Home</a> </body> </html>
Simplemente se debe usar la opción LogLevel en el fichero de configuración del servidor /etc/ssh/sshd_config.
LogLevel VERBOSE
Ejemplo de linenas de logs con el fingerprint de las llaves de usuario cuando el acceso es exitoso y cuando es fallido.
# Acceso exitoso. Jan 19 21:36:17 proxy sshd[6888]: Accepted publickey for root from 87.123.237.241 port 34578 ssh2: RSA d3:fa:64:0d:3e:be:3a:b0:50:cf:80:66:e8:2e:2a:a2 # Acceso denegado. Jan 19 21:36:17 proxy sshd[6888]: Failed publickey for root from 87.123.237.241 port 34578 ssh2: RSA c2:8f:3f:d0:80:6b:68:17:2d:77:7e:3c:79:d2:ae:90
Dependiendo de la versión del servidor ssh, es posible encontrarse en sus logs los fingerprint de las llaves lciente en formato MD5 o actualmente SHA256. Por lo tanto si se plantea comparar fingeprints, hay que prestar especial atención a dicho formato, ya que por ejemplo en versiones Centos menores a 6.X se usa el algoritmo MD5 mientras que las versiones posteriores implementan SHA256.
La versión cliente de ssh también usará de manera predeterminada un algoritmo u otro, en versiones antiguas la opción “-E” no se encuentra disponible y la única forma de representar la fingerprint es mediante MD5.
Fingerprint de una llave pública.
# Fingerprint en SHA256. ssh-keygen -lf fichero.pub 22048 SHA256:Qvzf9agby1GUQmVVaTDg85cCO0v3aUEsIaKY8I5EpzI root@localhost.localdomain (RSA) # Usando MD5 ssh-keygen -lf fichero.pub -E md5 2048 MD5:c2:8f:3f:d0:80:6b:68:17:2d:77:7e:3c:79:d2:ae:90 root@localhost.localdomain (RSA)
Listar los fingerprints de todas las llaves en el fichero authorized_keys.(Función para .bashrc).
function fingerprints() { local file="$1" while read l; do [[ -n $l && ${l###} = $l ]] && ssh-keygen -l -f /dev/stdin <<<$l done < $file }
fingerprints $HOME/.ssh/authorized_keys
Si se quiere obtener el fingerprint de una linea en concreto de authorized_keys. (ej. Linea 2)
ssh-keygen -l -f /dev/stdin <<<$(head -n 2 .ssh/authorized_keys)
NOTA: No olvidar la opción “-E md5” si se están usando versiones actuales de ssh-keygen y se quiere obtener el hash en formato MD5.