Table of Contents

Mostrar clave pública con su fingerprint correspondiente de servidores SSH externos

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

checkssl.php
<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>

Mostrar en los logs de SSHD los fingerprint de las llaves de usuario

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

Mostrar fingerprint de claves públicas SSH / authorized_keys

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.