- Is the exchange of public keys between the server and client done once for the following all sessions, until they are changed?
Sim. As chaves para a troca de chaves para cada troca de chaves.
- are the sessions keys generated on the client and on the server once per session?
Sim. A menos que você transfira muitos dados, sua sessão dura o suficiente ou você força o Rekeying (ou configura a recriação para ocorrer com mais frequência do que o necessário). RekeyLimit
na configuração do servidor e do cliente.
Each time they are generated, they take private keys and public keys as inputs. Does it mean that the session keys for different sessions are the same, as long as the private and public keys stay the same?
Como acima. Estas são chaves são geradas apenas para a troca de chaves. Eles não são chaves de autenticação nem chaves de host, como discutido anteriormente em perguntas anteriores.
- why does the quote say that the session keys generated on the server and on the client in the same session are "identical"?
Este é o ponto da troca de chaves. Eu realmente gosto desta imagem abaixo explicando (de wikipedia ). Eles são gerados independentemente, com base no conhecimento de uma chave privada, mas os dados que trafegam pela rede (chaves públicas) não são suficientes para construir esse segredo compartilhado.
- the bullet 8 seems to say that user authentication happens after the session keys are generated?
If yes, does user authentication use the session keys generated on the client and on the server, or just use the public and private keys on the client and on the server?
Não. As chaves de sessão são usadas para criptografia do canal pela rede. O ponto é que, antes da troca de chaves, os dados viajam pela rede sem segurança e qualquer um pode interceptar / modificar / inserir quaisquer dados. Após a troca de chaves, os dados são criptografados usando cifra e "autenticados" usando MAC.
Há muita informação sobre o protocolo SSH. O projeto OpenSSH tem uma página dedicada com todos os padrões (RFCs) implementados para o protocolo SSH. Provavelmente o mais importante é RFC4253 . Também o código fonte do openssh pode explicar muito.
Espero ter deixado um pouco mais claro. Se algo estiver faltando, me avise.