A partir do atual mestre portável do OpenSSH ( link ), isso não é possível.
A lógica relevante está na a função check_host_key () , que chama check_host_cert()
apenas uma vez - com o nome do host que foi originalmente passado para ssh_login()
modificado apenas pela normalização de todos os caracteres para minúsculas. Esse mesmo nome de host passou por resolve_host()
para obter a estrutura addrinfo *
usada para a conexão real; resolve_host()
respeita algumas opções (selecionando a família de endereços a ser usada), mas, por outro lado, não fornece um mecanismo de substituição.
Dito isto, a alteração necessária é curta (presentemente submetida à lista de discussão do upstream e à revisão pendente):
From 367fd8323d864daaf486047850f93c2167c66f37 Mon Sep 17 00:00:00 2001
From: Charles Duffy <[email protected]>
Date: Tue, 17 Feb 2015 09:49:32 -0600
Subject: [PATCH] Allow HostKeyAlias to match a host certificate principal if
HostName does not
---
sshconnect.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sshconnect.c b/sshconnect.c
index df921be..666c3ff 100644
--- a/sshconnect.c
+++ b/sshconnect.c
@@ -902,7 +902,8 @@ check_host_key(char *hostname, struct sockaddr *hostaddr, u_short port,
debug("Found %s in %s:%lu", want_cert ? "CA key" : "key",
host_found->file, host_found->line);
if (want_cert && !check_host_cert(hostname, host_key))
- goto fail;
+ if (options.host_key_alias == NULL || !check_host_cert(options.host_key_alias, host_key))
+ goto fail;
if (options.check_host_ip && ip_status == HOST_NEW) {
if (readonly || want_cert)
logit("%s host key for IP address "
--
2.0.0