Resposta curta:
O SSL é o precursor do TLS. O SSL era um protocolo proprietário desenvolvido pela Netscape Communications, posteriormente padronizado no IETF e renomeado como TLS. Em resumo, as versões estão nesta ordem: SSLv2, SSLv3, TLSv1.0, TLSv1.1 e TLSv1.2.
Ao contrário de uma crença relativamente ampla, não se trata de ter que executar um serviço em uma porta distinta com SSL e poder estar na mesma porta que a variante de texto sem formatação do TLS. SSL e TLS podem ser usados para as duas abordagens. Trata-se da diferença entre SSL / TLS na conexão (às vezes chamado de "SSL / TLS implícito") e SSL / TLS após a emissão de um comando no nível do protocolo, geralmente STARTTLS
(às vezes chamado de "SSL / TLS explícito") . A palavra-chave STARTTLS
é "INICIAR", não TLS. É uma mensagem, no nível do protocolo do aplicativo, para indicar que é necessário mudar para SSL / TLS, se não tiver sido iniciado antes da troca do protocolo do aplicativo.
O uso de ambos os modos deve ser equivalente, desde que o cliente esteja configurado para esperar SSL / TLS de uma maneira ou de outra, para não ser rebaixado para uma conexão de texto sem formatação.
Resposta mais longa:
SSL vs TLS
Tanto quanto sei, o SSLv1 nunca saiu dos laboratórios. SSLv2 e SSLv3 foram protocolos desenvolvidos pela Netscape. O SSLv2 é considerado inseguro há algum tempo, pois é propenso a fazer downgrade de ataques. O SSLv3 usa internamente (3,0)
como seu número de versão (na ClientHello
mensagem).
TLS é o resultado da padronização como um protocolo mais aberto no IETF. (Acho que li em algum lugar, talvez no livro de E. Rescorla, que o nome foi escolhido de tal forma que todos os participantes ficaram igualmente descontentes com ele, para não favorecer uma empresa em particular: essa é uma prática bastante comum em padrões. .) Os interessados em como a transição foi realizada podem ler as Perguntas frequentes sobre a lista de discussão SSL ; existem várias cópias deste documento, mas a maioria dos links (para ) está desatualizada.netscape.com
O TLS usa mensagens muito semelhantes (suficientemente diferentes para tornar os protocolos incompatíveis, embora seja possível negociar uma versão comum ). Os TLS 1.0 , 1.1 e 1.2 ClientHello
mensagens usar (3,1)
, (3,2)
, (3,3)
para indicar o número da versão, o que mostra claramente a continuação da SSL.
Há mais detalhes sobre as diferenças de protocolo nesta resposta .
Quando uso qual? Quando não uso qual?
Use a versão mais alta possível, se possível. Na prática, como provedor de serviços, isso exigirá que seus usuários tenham clientes que suportam essas versões. Como sempre, é sempre um exercício de avaliação de risco (de preferência com um caso de negócios, se apropriado). Dito isto, corte o SSLv2 de qualquer maneira.
Além disso, observe que a segurança fornecida pelo SSL / TLS não é apenas sobre qual versão você usa, mas também sobre a configuração adequada: certamente é preferível usar o SSLv3 com um conjunto de cifras forte do que o TLSv1.0 com um com um valor fraco (ou criptografia anônima / nula). Alguns conjuntos de cifras, considerados muito fracos, foram explicitamente proibidos por versões mais recentes do TLS. As tabelas no provedor Java 7 SunJSSE (e suas notas de rodapé) podem ser de interesse se você desejar obter mais detalhes.
Seria preferível usar o TLS 1.1 pelo menos, mas nem todos os clientes ainda os suportam infelizmente (por exemplo, Java 6). Ao usar uma versão sob 1.1, certamente vale a pena atenuar a vulnerabilidade do BEAST .
Eu geralmente recomendaria o livro de Eric Rescorla - SSL e TLS: projetando e construindo sistemas seguros, Addison-Wesley, 2001 ISBN 0-201-61598-3 para pessoas que realmente querem mais detalhes.
SSL / TLS implícito vs explícito
Existe um mito dizendo que o TLS permite que você use a mesma porta, enquanto o SSL não pode. Isso simplesmente não é verdade (e deixarei de fora a unificação de portas para esta discussão). Infelizmente, esse mito parece ter sido propagado para os usuários pelo fato de que alguns aplicativos como o MS Outlook às vezes oferecem uma escolha entre SSL e TLS em suas opções de configuração, quando na verdade significam uma escolha entre SSL / TLS implícito e explícito. (Existem especialistas em SSL / TLS na Microsoft, mas parece que eles não estavam envolvidos na interface do usuário do Outlook.)
Eu acho que a razão pela qual essa confusão acontece é por causa do STARTTLS
modo. Parece que algumas pessoas entenderam isso como STARTTLS
= TLS, mas esse não é o caso. A palavra-chave STARTTLS
é "INICIAR", não TLS. Por que isso não foi chamado STARTSSL
ou STARTSSLORTLS
é porque essas extensões foram especificadas no IETF, que usava apenas nomes usados em suas especificações (assumindo que o nome TLS acabaria sendo o único em pé, eu acho).
- SSL na mesma porta que o serviço de texto sem formatação: proxy HTTPS.
Atualmente, a maioria dos servidores HTTPS pode lidar com TLS, mas alguns anos atrás, a maioria das pessoas estava usando SSLv3 para HTTPS. HTTPS (estritamente falando, padronizado como HTTP sobre TLS ) normalmente estabelece a conexão SSL / TLS na conexão TCP e depois troca a mensagem HTTP pela camada SSL / TLS. Há uma exceção a isso ao usar um proxy HTTP no meio. Nesse caso, o cliente se conecta ao proxy HTTP de forma clara (normalmente na porta 3128), emite o CONNECT
comando HTTP e, desde que a resposta tenha sido bem-sucedida, inicia o handshake SSL / TLS enviando umClientHello
mensagem. Tudo isso acontece na mesma porta no que diz respeito à conexão entre o navegador e o proxy (obviamente não entre o proxy e o servidor de destino: não é nem a mesma máquina). Isso funciona muito bem com o SSLv3. Muitos de nós, em situações atrás de um proxy, terão usado isso em servidores que não suportam pelo menos TLS 1.0.
- SSL na mesma porta que o serviço de texto sem formatação: email.
Este está claramente fora das especificações, mas, na prática, geralmente funciona. A rigor, as especificações falam sobre a mudança para TLS (não SSL) após o uso do comando STARTTLS. Na prática, o SSL geralmente também funciona (assim como a especificação "HTTP sobre TLS" também abrange o uso do SSL em vez do TLS). Você pode tentar sozinho. Supondo que você tenha um servidor SMTP ou IMAP compatível com STARTTLS, use o Thunderbird, entre nas preferências, opções avançadas, editor de configuração e desligue security.enable_tls
. Muitos servidores ainda aceitarão a conexão, simplesmente porque suas implementações delegam a camada SSL / TLS a uma biblioteca SSL / TLS que geralmente poderá lidar com SSL e TLS da mesma maneira, a menos que configurado para não fazê-lo. Como o FAQ do OpenLDAP coloca, "Embora o mecanismo seja projetado para uso com o TLSv1, a maioria das implementações se reserva no SSLv3 (e SSLv2), se necessário. ". Se você não tiver certeza, verifique com uma ferramenta como o Wireshark.
- TLS em uma porta distinta.
Muitos clientes podem usar o TLS 1.0 (pelo menos) para protocolos em que a variante segura está em uma porta diferente. Obviamente, há vários navegadores e servidores da Web que suportam TLS 1.0 (ou superior) para HTTPS. Da mesma forma, SMTPS, IMAPS, POPS e LDAPS também podem usar TLS. Eles não estão limitados ao SSL.
Quando uso qual? Quando não uso qual?
Entre SSL / TLS explícito e implícito, isso realmente não importa. O que importa é que seu cliente saiba o que esperar e esteja configurado adequadamente para fazê-lo. Mais importante, ele deve ser configurado para rejeitar conexões de texto sem formatação quando espera uma conexão SSL / TLS, implícita ou explícita .
A principal diferença entre SSL / TLS explícito e implícito estará na clareza das configurações.
Por exemplo, para LDAP, se o cliente for um servidor Apache Httpd ( mod_ldap
- sua documentação também identifica incorretamente a diferença entre SSL e TLS, infelizmente), você pode usar SSL / TLS implícito usando uma ldaps://
URL (por exemplo AuthLDAPURL ldaps://127.0.0.1/dc=example,dc=com?uid?one
) ou usar SSL / TLS usando um parâmetro extra (por exemplo AuthLDAPURL ldap://127.0.0.1/dc=example,dc=com?uid?one TLS
).
Há, talvez, de um modo geral um risco ligeiramente menor ao especificar o protocolo de segurança no esquema URL ( https
, ldaps
...) do que quando esperando o cliente para configurar uma configuração adicional para habilitar SSL / TLS, porque eles podem esquecer. Isso é discutível. Também pode haver problemas na correção da implementação de um contra o outro (por exemplo, acho que o cliente Java LDAP não suporta verificação de nome de host ao usar ldaps://
, quando deveria, enquanto é suportado com ldap://
+ StartTLS).
Na dúvida, e para ser compatível com mais clientes, se possível, não parece prejudicar oferecer ambos os serviços quando o servidor o suportar (o servidor apenas escutará em duas portas ao mesmo tempo). Muitas implementações de servidor para protocolos que podem ser usados com ambos os modos suportam ambos.
É de responsabilidade do cliente não se deixar fazer o downgrade para uma conexão de texto sem formatação. Como administrador de servidor, não há nada que você possa fazer tecnicamente do seu lado para impedir ataques de downgrade (além de exigir um certificado de cliente, talvez). O cliente deve verificar se o SSL / TLS está ativado, seja na conexão ou após um STARTTLS
comando-like. Da mesma forma que um navegador não deve ser redirecionado de https://
para http://
, um cliente para um protocolo que suporte STARTTLS
deve garantir que a resposta seja positiva e que a conexão SSL / TLS esteja ativada antes de prosseguir. Caso contrário, um invasor MITM ativo poderia facilmente fazer o downgrade de ambas as conexões.
Por exemplo, versões anteriores do Thunderbird tinham uma opção ruim para isso chamada "Usar TLS, se disponível" , o que implicava essencialmente que, se um invasor do MITM pudesse alterar as mensagens do servidor para não anunciar suporte para STARTTLS, o cliente silenciosamente seria rebaixado para uma conexão de texto sem formatação. (Esta opção não segura não está mais disponível no Thunderbird.)