Essa é uma grande questão =) A seguir, uma visão geral de alto nível do HTTPS; grite se algo não estiver claro e preencherei mais detalhes.
Quando você usa uma conexão HTTPS, a criptografia de chave pública é usada apenas durante a inicialização da sessão. Parte dessa inicialização é a troca segura de uma chave privada compartilhada que é usada para criptografia simétrica. A razão para isso é que a criptografia assimétrica (chave pública) é significativamente mais lenta que a criptografia de chave simétrica, devido à matemática envolvida.
handshake SSL
Em um nível muito alto, o protocolo é algo assim:
-
O cliente envia a mensagem inicial "HELLO", que contém a versão ssl que gostaria de usar, uma sequência pseudo-aleatória de bits (vamos chamá-la B1) e uma lista das várias cifras que ela suporta.
-
O servidor responde com sua própria mensagem "HELLO", outra string pseudo-aleatória de bits (vamos chamá-lo de B2), a cifra que ele selecionou (normalmente a cifra mais strong da lista que o cliente enviou que o server supports), e seu certificado que contém sua chave pública (vamos chamar isso de k ).
-
O cliente então usa o certificado para autenticar o servidor (veja abaixo) e cria um "segredo pré-mestre" - outra sequência de bits pseduo-aleatórios que chamaremos de S.
-
Se o cliente estiver satisfeito com os resultados da autenticação do servidor, ele criptografa o segredo pré-mestre S com a chave pública do servidor k e o envia para o servidor (o próprio S é criptografado, mas a conexão ainda não é).
-
Neste ponto, o servidor e o cliente compartilham três sequências de bits - B1, B2 e S. B1 e B2 foram enviados na forma clara - S foi criptografado e, portanto, supondo que a chave privada do servidor seja realmente privada , é conhecido apenas pelo cliente e servidor.
-
O cliente e o servidor usam essas sequências de três bits para construir a chave de sessão - uma string conhecida apenas por eles e que pode ser usada como uma chave na criptografia simétrica selecionada anteriormente.
-
Cliente e servidor trocam mensagens que indicam que estão mudando de protocolo e todas as mensagens subseqüentes são criptografadas (simetricamente, com a chave computada acima).
Autenticação do servidor
Quando o cliente recebe a mensagem HELLO do servidor, ele precisa ter certeza de que está falando com o servidor que acha que está. O certificado e a chave do servidor são usados para estabelecer essa confiança.
Todo certificado digital é um terceiro afirmando que "essa entidade contém a chave privada que corresponde a essa chave pública, que está incorporada neste certificado". Organizações como a Verisign farão essa afirmação - por um preço. A razão pela qual as pessoas pagam à Verisign e a outras por certificados é que a Verisign se deu ao trabalho de inserir seus certificados intermediários na maioria dos navegadores comuns.
Assim, quando o cliente receber o servidor HELLO, ele executará as seguintes verificações:
- A data de hoje está dentro do período de validade do certificado?
- O nome da entidade do certificado corresponde ao do servidor ao qual estou tentando me conectar?
- O nome do emissor no certificado corresponde a alguma das CAs cujas chaves públicas eu conheço?
- Em caso afirmativo, a chave pública que tenho para esta CA validar este certificado?
Se todas as verificações passarem, o cliente assume que pode acreditar que o servidor é quem estava esperando. Em seguida, ele tira a chave pública (ainda k ) do certificado e a usa para transmitir com segurança S para o servidor. Neste ponto, a idéia é que você tenha a afirmação de algum terceiro (Verisign) de que a chave pública pertence ao servidor; então, somente o servidor poderá descriptografar o resultado de E (S, k ) e, portanto, somente o servidor poderá produzir a chave correspondente que você usará para a cifra simétrica.
Após o handshake, sua confiança de que os pacotes não podem ser lidos por terceiros deve ser igual à sua confiança no algoritmo simétrico que está sendo usado.
(Há outras reviravoltas interessantes - por exemplo, o uso de três sequências de caracteres para evitar ataques de repetição. Se apenas S foi usado, um invasor pode gravar toda a sessão e reproduzi-la como quiser - por exemplo, repetindo uma transferência de dinheiro Ao fazer com que o cliente e o servidor gerem strings pseduo-random adicionais, você reduz bastante a probabilidade de dois handshakes SSL independentes produzirem o mesmo S.)