===== 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]]
Check SSH - Result
";
//echo $p."
";
$f = tempnam('','CS');//http://php.net/manual/en/function.tempnam.php
//echo $f."
";
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.";
?>
Home
===== 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.