Os objetivos deste protocolo são a segurança por meio de criptografia, a interoperabilidade, a extensabilidade e a eficiência.
Isso quer dizer que este protocolo é capaz de estabelecer uma conexão segura entre duas entidades e de garantir que dois aplicativos consigam se comunicar ou trocar parâmetros independentemente da forma como foram construídos. É também capaz de abarcar futuras extensões, diminuindo a necessidade de se criar um novo protocolo e impedindo a criação de uma nova biblioteca de segurança. Esses dois últimos pontos são muito importantes, já que a criação de um protocolo ou de métodos de segurança podem trazer novos pontos falhos. A eficiência do protocolo vem do número reduzido de conexões necessárias, uma vez que é utilizado cache para guardar certas informações, poupando também tempo de processamento.
Em muitas aplicações, o TLS é apenas unilateral (situação típica da navegação web), ou seja, apenas um dos lados (o servidor) é autenticado, permanecendo o cliente anônimo ou não-autenticado. Apesar disso é plenamente possível que a autenticação seja bilateral, tendo o cliente, portanto, que possuir também um certificado de autenticidade.
Ao estabelecer uma conexão TLS, cliente e servidor negociam um conjunto de códigos, chamado em inglês de CipherSuite, por meio das primeiras mensagens da comunicação. Dessa forma, ambos os lados sabem que algoritmos criptográficos deverão utilizar para encriptar ou decriptar as mensagens. Pode ser usado chave simétrica ou chave assimétrica no processo de autenticação dos participantes.
Estrutura
O Protocolo TLS se situa entre as camadas de Aplicação e Transporte. Ele encapsula os protocolos de aplicação como o HTTP (Hypertext Transfer Protocol) e o FTP (File Transfer Protocol) e trabalha em cima de um protocolo de transporte como o TCP (Transmission Control Protocol) e o UDP (User Datagram Protocol). Para que a transmissão seja confiável, deve ser utilizado o protocolo TCP, uma vez que o UDP está mais sujeito à perdas de informação, já que é datagrama.
Na figura abaixo, é possível enxergar melhor o posicionamento do TLS, em meio às demais camadas:
O Protocolo TLS é composto também de duas camadas, formadas por 2 tipos de protocolos: os protocolos de Handshaking e o Protocolo de Registro. Essa estrutura pode ser melhor observada na figura abaixo:
Os protocolos de Handshaking são utilizados para autenticar cliente e servidor e para negociar algoritmos de criptografia e chaves criptográficas, antes que o protocolo de aplicação seja de fato transmitido. Uma vez que ambos os lados concordem quanto à autenticidade um do outro e também quanto aos parâmetros de segurança, a transmissão segura pode então começar. Esses protocolos de negociação são encapsulados pelo Protocolo de Registro, e então são enviados.
Subprotocolos
O protocolo de Registro (Record Protocol)
Este protocolo fragmenta as mensagens em blocos, podendo então comprimí-los, e adiciona a eles um código MAC (Message Authentication Code), encripta e transmite o resultado. Ele também é organizado em camadas. Em cada uma delas, as mensagens podem incluir campos com o tamanho da mensagem, a descrição e o conteúdo.
Os protocolos de Handshaking usam o protocolo de Registro e serão descritos abaixo, eles permitem que ambos os lados da conexão concordem quanto a parâmetros de segurança, métodos criptográficos, autenticação das partes e identificação de erros.
O protocolo Handshake
É o responsável pela negociação de uma sessão, que é composta do seu identificador, dos certificados padrão X.509 de ambas as partes (ou de apenas um lado), do método de compressão a ser utilizado, das especificações criptográficas (algoritmos de encriptação e autenticação), entre outros.
Os dados contidos neste protocolo servirão de parâmetros para o protocolo de Registro, quando este estiver cuidando da segurança do protocolo de Aplicação. Uma sessão já iniciada pelo protocolo Handshake pode ser retomada, pois este é um recurso do subprotocolo.
Quando cliente e servidor iniciam uma conexão, eles concordam quanto à versão do protocolo que está sendo utilizada, quanto aos algoritmos criptográficos, e fazem a autenticação um do outro. O protocolo implementa isso através da troca de mensagens de “Hello”, da troca de parâmetros de criptografia e da troca de certificados visando a autenticação dos pares.
Funciona como no quadro acima: o cliente primeiro envia um “ClientHello”, ao que o servidor deve responder com um “ServerHello”, definindo então a versão do protocolo, o identificador da sessão, o conjunto de códigos para encriptação, e o método de compressão. Além disso, dois valores aleatórios também são gerados e trocados, para que após seja computado um “segredo” ou código ou chave, que será usado para autenticar ambos os lados junto com os certificados, nas próximas mensagens “Certificate” e “ServerKeyExchange”, terminando com o “ServerHelloDone” que indica o fim da fase “Hello”de handshake.
Em seguida, se o servidor exigir, o cliente também deve apresentar seu certificado, então enviar o “ClientKeyExchange”, cujo conteúdo vai depender dos códigos acordados entre as partes no início da negociação, e pode verificar a autenticidade do certificado do servidor. Após isso, os dois lados trocam “ChangeCipherSpec” e terminam o handshake, podendo então transferir os dados do protocolo de aplicação.
O Protocolo ChangeCipherSpec
Sua função é marcar as mudanças nos critérios de criptografia. Ele consiste numa única mensagem, que é encriptada e comprimida. Este tipo de mensagem é enviado por ambos os lados da conexão, com o intuito de notificar o outro lado de que as próximas mensagens serão protegidas pelos novos métodos especificados.
O lado que enviar primeiro a mensagem de ChangeCipherSpec não tem conhecimento sobre se o outro lado está pronto para recebê-la e começar a utilizar a nova especificação de encriptamento. Caso a operação que o outro lado esteja executanto seja mais custosa computacionalmente, durante um certo tempo esse lado deverá armazenar as mensagens num buffer, afim de que quando terminar, poder trabalhar segundo as novas especificações.
O Protocolo de Alerta (Alert Protocol)
O conteúdo de alerta, provido pelo subprotocolo de alerta, também é suportado pelo protocolo de registro. Essas mensagens se distinguem entre avisos e erros fatais e são compostas pelas suas devidas descrições. Alertas fatais resultam em fechamento imediato da conexão, tornando o identificador da sessão inválido, evitando então que esta sessão seja utilizada em novas conexões. Como qualquer outra mensagem, esses alertas também são comprimidos e encriptados para serem então transmitidos.
Aqui é importante dizer que quando há alertas de fechamento, ambos os lados da conexão devem estar cientes que há intenção de fechar a conexão. Dessa forma evita-se alguns tipos de ataques. Qualquer lado pode enviar um alerta de fechamento, indicando que quaisquer dados que sejam enviados após isso devem ser ignorados.
Métodos Criptográficos
Algoritmo RSA
Este algoritmo é largamente utilizado para criptografar mensagens e é famoso pela grande dificuldade em ser quebrado, sendo então uma ótima opção para encriptar as mensagens transmitidas com o TLS. Ele é composto por um par de chaves, pública e privada. A primeira é de conhecimento de todos os envolvidos e a segunda fica em segredo. As mensagens cifradas com uma chave pública só poderão ser decifradas utilizando uma chave privada que forma o respectivo par de chaves.
São gerados dois pares de números, cada chave é composta de um par, sendo que uma mensagem encriptada com um par só possa ser decriptada com o outro par. Então, o par que representa a chave pública é divulgado, para que o outro lado da conexão encripte a mensagem com esse par. Isso funciona pois apenas o lado que enviou a chave pública poderá decriptar a mensagem, pois ele é o único que possui a chave privada.