Eu tenho uma configuração como abaixo no meu arquivo ~/.ssh/config:
Host xxx
HostName 127.0.0.1
Port 2222
User gigi
ServerAliveInterval 30
IdentityFile ~/blablabla
# CertificateFile ~/blablabla-cert.pub
que funciona bem, mas estou curioso sobre como alguém geraria o CertificateFile
se realmente deseja usá-lo? Considere que um já possui as chaves RSA privadas e públicas geradas com, por exemplo, openssl req -newkey rsa:2048 -x509 [...]
.
O modelo de certificado de autenticação usado pelo SSH é uma variação do método de autenticação de chave pública. Com certificados, a chave pública de cada usuário (ou host) é assinada por outra chave, conhecida como autoridade de certificação (CA). A mesma CA pode ser usada para assinar várias chaves de usuário ou host. O usuário ou o host pode confiar em uma única autoridade de certificação em vez de ter que confiar em cada chave de usuário/host individual. Como essa é uma alteração no modelo de autenticação, a implementação de certificados requer alterações no lado do cliente e do servidor.
Além disso, observe que os certificados usados pelo SSL (os gerados por
openssl
) são diferentes dos usados pelo SSH. Este tópico é explicado por estes QAs no Security SE: Qual é a diferença entre SSL e SSH? , Convertendo chaves entre OpenSSL e OpenSSH .Agora, como a questão é sobre como um cliente pode se conectar a um servidor usando um certificado SSH, vejamos essa abordagem. A página de manual para
ssh-keygen
tem algumas informações relevantes:A primeira coisa que vamos precisar aqui é uma chave CA. Uma chave CA é um par de chaves pública-privada regular, então vamos gerar uma como de costume:
A
-f ca
opção simplesmente especifica o nome do arquivo de saída como 'ca'. Isso resulta na geração de dois arquivos - ca (chave privada) e ca.pub (chave pública).Em seguida, assinaremos nossa chave de usuário com a chave privada da CA (seguindo o exemplo do manual):
Isso gerará um novo arquivo chamado
~/.ssh/id_rsa-cert.pub
que contém o certificado SSH. A-s
opção especifica o caminho para a chave privada da autoridade de certificação, a-I
opção especifica um identificador que é registrado no lado do servidor e a-n
opção especifica o principal (nome de usuário). O conteúdo do certificado pode ser verificado executandossh-keygen -L -f ~/.ssh/id_rsa-cert.pub
.Neste ponto, você está livre para editar seu arquivo de configuração (~/.ssh/config) e incluir a
CertificateFile
diretiva para apontar para o certificado recém-gerado. Como indica o manual , aIdentityFile
diretiva também deve ser especificada junto com ela para identificar a chave privada correspondente.A última coisa a fazer é dizer ao servidor para confiar em seu certificado CA. Você precisará copiar a chave pública do certificado CA para o servidor de destino. Isso é feito editando o
/etc/ssh/sshd_config
arquivo e especificando aTrustedUserCAKeys
diretiva:Feito isso, reinicie o daemon SSH no servidor. No meu sistema CentOS, isso é feito executando
systemctl restart sshd
. Depois disso, você poderá fazer login no sistema usando seu certificado. Rastrear suassh
conexão usando o sinalizador detalhado (-v
) mostrará o certificado que está sendo oferecido ao servidor e o servidor que o aceita.Uma última coisa a ser observada aqui é que qualquer chave de usuário assinada com a mesma chave CA agora será confiável para o servidor de destino. O acesso às chaves da CA deve ser controlado em qualquer cenário prático. Também existem diretivas como essas
AuthorizedPrincipalsFile
que podem ser usadas para limitar o acesso do lado do servidor. Veja o manual do sshd_config para mais detalhes. Do lado do cliente, os certificados também podem ser criados com especificações mais rígidas. Consulte o manual do ssh-keygen para obter esses detalhes.Para converter seu
.crt
para.pub
apenas fazer isso:Extraia a chave pública
Converter para um formato SSH (PKCS8)