You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -14,38 +14,186 @@ Para aprender o básico de HTTPS de uma perspectiva do usuário, verifique <a hr
14
14
15
15
Agora, a partir de uma perspectiva do desenvolvedor, aqui estão algumas coisas para ter em mente ao pensar em HTTPS:
16
16
17
-
* Para HTTPS, o servidor precisa ter certificados gerados por um terceiro.
18
-
* Esses certificados são adquiridos de um terceiro, eles não são simplesmente "gerados".
19
-
* Certificados têm um tempo de vida.
20
-
* Eles expiram.
21
-
* E então eles precisam ser renovados, adquirindo-os novamente de um terceiro.
22
-
* A criptografia da conexão acontece no nível TCP.
23
-
* Essa é uma camada abaixo do HTTP.
24
-
* Portanto, o manuseio do certificado e da criptografia é feito antes do HTTP.
25
-
* O TCP não sabe sobre "domínios". Apenas sobre endereços IP.
26
-
* As informações sobre o domínio solicitado vão nos dados HTTP.
27
-
* Os certificados HTTPS “certificam” um determinado domínio, mas o protocolo e a encriptação acontecem ao nível do TCP, antes de sabermos de que domínio se trata.
28
-
* Por padrão, isso significa que você só pode ter um certificado HTTPS por endereço IP.
17
+
* Para HTTPS, **o servidor** precisa ter certificados gerados por **um terceiro**.
18
+
* Esses certificados são na verdade **adquiridos** de um terceiro, eles não são simplesmente "gerados".
19
+
* Certificados têm um **tempo de vida**.
20
+
* Eles **expiram**.
21
+
* E então eles precisam ser **renovados**, **adquirindo-os novamente** de um terceiro.
22
+
* A criptografia da conexão acontece no **nível TCP**.
23
+
* Essa é uma camada **abaixo do HTTP**.
24
+
* Portanto, o manuseio do **certificado e da criptografia** é feito **antes do HTTP**.
25
+
***O TCP não sabe sobre "domínios"**. Apenas sobre endereços IP.
26
+
* As informações sobre o **domínio solicitado** vão nos **dados HTTP**.
27
+
* Os **certificados HTTPS** “certificam” um **determinado domínio**, mas o protocolo e a encriptação acontecem ao nível do TCP, **antes de sabermos** de que domínio se trata.
28
+
***Por padrão**, isso significa que você só pode ter **um certificado HTTPS por endereço IP**.
29
29
* Não importa o tamanho do seu servidor ou quão pequeno cada aplicativo que você tem nele possa ser.
30
-
* No entanto, existe uma solução para isso.
31
-
* Há uma extensão para o protocolo TLS (aquele que lida com a criptografia no nível TCP, antes do HTTP) chamado <ahref="https://en.wikipedia.org/wiki/Server_Name_Indication"class="external-link"target="_blank"><abbrtitle="Server Name Indication">SNI</abbr></a>.
32
-
* Esta extensão SNI permite que um único servidor (com um único endereço IP) tenha vários certificados HTTPS e atenda a vários domínios / aplicativos HTTPS.
33
-
* Para que isso funcione, um único componente (programa) em execução no servidor, ouvindo no endereço IP público, deve ter todos os certificados HTTPS no servidor.
34
-
* Depois de obter uma conexão segura, o protocolo de comunicação ainda é HTTP.
35
-
* Os conteúdos são criptografados, embora sejam enviados com o protocolo HTTP.
30
+
* No entanto, existe uma **solução** para isso.
31
+
* Há uma **extensão** para o protocolo **TLS** (aquele que lida com a criptografia no nível TCP, antes do HTTP) chamado **<ahref="https://en.wikipedia.org/wiki/Server_Name_Indication"class="external-link"target="_blank"><abbrtitle="Server Name Indication">SNI</abbr></a>**.
32
+
* Esta extensão SNI permite que um único servidor (com um **único endereço IP**) tenha **vários certificados HTTPS** e atenda a **vários domínios / aplicativos HTTPS**.
33
+
* Para que isso funcione, um **único** componente (programa) em execução no servidor, ouvindo no **endereço IP público**, deve ter **todos os certificados HTTPS** no servidor.
34
+
***Depois** de obter uma conexão segura, o protocolo de comunicação **ainda é HTTP**.
35
+
* Os conteúdos são **criptografados**, embora sejam enviados com o **protocolo HTTP**.
36
36
37
-
É uma prática comum ter um programa/servidor HTTP em execução no servidor (máquina, host, etc.) e gerenciar todas as partes HTTPS: enviando as solicitações HTTP descriptografadas para o aplicativo HTTP real em execução no mesmo servidor (a aplicação **FastAPI**, neste caso), pegue a resposta HTTP do aplicativo, criptografe-a usando o certificado apropriado e envie-a de volta ao cliente usando HTTPS. Este servidor é frequentemente chamado de <ahref="https://en.wikipedia.org/wiki/TLS_termination_proxy"class="external-link"target="_blank">TLS Termination Proxy</a>.
37
+
É uma prática comum ter um **programa/servidor HTTP** em execução no servidor (máquina, host, etc.) e **gerenciar todas as partes HTTPS**: **recebendo as requisições encriptadas**, enviando as **solicitações HTTP descriptografadas** para o aplicativo HTTP real em execução no mesmo servidor (a aplicação **FastAPI**, neste caso), pegue a **resposta HTTP** do aplicativo, **criptografe-a** usando o **certificado HTTPS** apropriado e envie-a de volta ao cliente usando **HTTPS**. Este servidor é frequentemente chamado de **<ahref="https://en.wikipedia.org/wiki/TLS_termination_proxy"class="external-link"target="_blank">Proxy de Terminação TLS</a>**.
38
+
39
+
Algumas das opções que você pode usar como Proxy de Terminação TLS são:
40
+
41
+
* Traefik (que também pode gerenciar a renovação de certificados)
42
+
* Caddy (que também pode gerenciar a renovação de certificados)
43
+
* Nginx
44
+
* HAProxy
38
45
39
46
## Let's Encrypt
40
47
41
-
Antes de Let's Encrypt, esses certificados HTTPS eram vendidos por terceiros confiáveis.
48
+
Antes de Let's Encrypt, esses **certificados HTTPS** eram vendidos por terceiros confiáveis.
42
49
43
50
O processo de aquisição de um desses certificados costumava ser complicado, exigia bastante papelada e os certificados eram bastante caros.
44
51
45
-
Mas então <ahref="https://letsencrypt.org/"class="external-link"target="_blank">Let's Encrypt</a> foi criado.
52
+
Mas então o **<ahref="https://letsencrypt.org/"class="external-link"target="_blank">Let's Encrypt</a>** foi criado.
46
53
47
-
Ele é um projeto da Linux Foundation que fornece certificados HTTPS gratuitamente. De forma automatizada. Esses certificados usam toda a segurança criptográfica padrão e têm vida curta (cerca de 3 meses), então a segurança é realmente melhor por causa de sua vida útil reduzida.
54
+
Ele é um projeto da Linux Foundation que fornece **certificados HTTPS gratuitamente**. De forma automatizada. Esses certificados usam toda a segurança criptográfica padrão e têm vida curta (cerca de 3 meses), então a **segurança é, na verdade, melhor** por causa de sua vida útil reduzida.
48
55
49
56
Os domínios são verificados com segurança e os certificados são gerados automaticamente. Isso também permite automatizar a renovação desses certificados.
50
57
51
-
A ideia é automatizar a aquisição e renovação desses certificados, para que você tenha HTTPS seguro, de graça e para sempre.
58
+
A ideia é automatizar a aquisição e renovação desses certificados, para que você tenha **HTTPS seguro, de graça e para sempre**.
59
+
60
+
## HTTPS para Desenvolvedores
61
+
62
+
Aqui está um exemplo de como uma API HTTPS poderia ser estruturada, passo a passo, com foco principal nas ideias relevantes para desenvolvedores.
63
+
64
+
### Nome do domínio
65
+
66
+
A etapa inicial provavelmente seria **adquirir** algum **nome de domínio**. Então, você iria configurá-lo em um servidor DNS (possivelmente no mesmo provedor em nuvem).
67
+
68
+
Você provavelmente usaria um servidor em nuvem (máquina virtual) ou algo parecido, e ele teria <abbrtitle="Que não muda">fixed</abbr> **Endereço IP público**.
69
+
70
+
No(s) servidor(es) DNS, você configuraria um registro (`registro A`) para apontar **seu domínio** para o **endereço IP público do seu servidor**.
71
+
72
+
Você provavelmente fará isso apenas uma vez, na primeira vez em que tudo estiver sendo configurado.
73
+
74
+
/// tip | Dica
75
+
76
+
Essa parte do Nome do Domínio se dá muito antes do HTTPS, mas como tudo depende do domínio e endereço IP público, vale a pena mencioná-la aqui.
77
+
78
+
///
79
+
80
+
### DNS
81
+
82
+
Agora vamos focar em todas as partes que realmente fazem parte do HTTPS.
83
+
84
+
Primeiro, o navegador iria verificar com os **servidores DNS** qual o **IP do domínio**, nesse caso, `someapp.example.com`.
85
+
86
+
Os servidores DNS iriam informar o navegador para utilizar algum **endereço IP** específico. Esse seria o endereço IP público em uso no seu servidor, que você configurou nos servidores DNS.
87
+
88
+
<imgsrc="/img/deployment/https/https01.svg">
89
+
90
+
### Início do Handshake TLS
91
+
92
+
O navegador então irá comunicar-se com esse endereço IP na **porta 443** (a porta HTTPS).
93
+
94
+
A primeira parte dessa comunicação é apenas para estabelecer a conexão entre o cliente e o servidor e para decidir as chaves criptográficas a serem utilizadas, etc.
95
+
96
+
<imgsrc="/img/deployment/https/https02.svg">
97
+
98
+
Esse interação entre o cliente e o servidor para estabelecer uma conexão TLS é chamada de **Handshake TLS**.
99
+
100
+
### TLS com a Extensão SNI
101
+
102
+
**Apenas um processo** no servidor pode se conectar a uma **porta** em um **endereço IP**. Poderiam existir outros processos conectados em outras portas desse mesmo endereço IP, mas apenas um para cada combinação de endereço IP e porta.
103
+
104
+
TLS (HTTPS) usa a porta `443` por padrão. Então essa é a porta que precisamos.
105
+
106
+
Como apenas um único processo pode se comunicar com essa porta, o processo que faria isso seria o **Proxy de Terminação TLS**.
107
+
108
+
O Proxy de Terminação TLS teria acesso a um ou mais **certificados TLS** (certificados HTTPS).
109
+
110
+
Utilizando a **extensão SNI** discutida acima, o Proxy de Terminação TLS iria checar qual dos certificados TLS (HTTPS) disponíveis deve ser usado para essa conexão, utilizando o que corresponda ao domínio esperado pelo cliente.
111
+
112
+
Nesse caso, ele usaria o certificado para `someapp.example.com`.
113
+
114
+
<imgsrc="/img/deployment/https/https03.svg">
115
+
116
+
O cliente já **confia** na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), então ele pode **verificar** que o certificado é válido.
117
+
118
+
Então, utilizando o certificado, o cliente e o Proxy de Terminação TLS **decidem como encriptar** o resto da **comunicação TCP**. Isso completa a parte do **Handshake TLS**.
119
+
120
+
Após isso, o cliente e o servidor possuem uma **conexão TCP encriptada**, que é provida pelo TLS. E então eles podem usar essa conexão para começar a **comunicação HTTP** propriamente dita.
121
+
122
+
E isso resume o que é **HTTPS**, apenas **HTTP** simples dentro de uma **conexão TLS segura** em vez de uma conexão TCP pura (não encriptada).
123
+
124
+
/// tip | Dica
125
+
126
+
Percebe que a encriptação da comunicação acontece no **nível do TCP**, não no nível do HTTP.
127
+
128
+
///
129
+
130
+
### Solicitação HTTPS
131
+
132
+
Agora que o cliente e servidor (especialmente o navegador e o Proxy de Terminação TLS) possuem uma **conexão TCP encriptada**, eles podem iniciar a **comunicação HTTP**.
133
+
134
+
Então, o cliente envia uma **solicitação HTTPS**. Que é apenas uma solicitação HTTP sobre uma conexão TLS encriptada.
135
+
136
+
<imgsrc="/img/deployment/https/https04.svg">
137
+
138
+
### Desencriptando a Solicitação
139
+
140
+
O Proxy de Terminação TLS então usaria a encriptação combinada para **desencriptar a solicitação**, e transmitiria a **solicitação básica (desencriptada)** para o processo executando a aplicação (por exemplo, um processo com Uvicorn executando a aplicação FastAPI).
141
+
142
+
<imgsrc="/img/deployment/https/https05.svg">
143
+
144
+
### Resposta HTTP
145
+
146
+
A aplicação processaria a solicitação e retornaria uma **resposta HTTP básica (não encriptada)** para o Proxy de Terminação TLS.
147
+
148
+
<imgsrc="/img/deployment/https/https06.svg">
149
+
150
+
### Resposta HTTPS
151
+
152
+
O Proxy de Terminação TLS iria **encriptar a resposta** utilizando a criptografia combinada anteriormente (que foi definida com o certificado para `someapp.example.com`), e devolveria para o navegador.
153
+
154
+
No próximo passo, o navegador verifica que a resposta é válida e encriptada com a chave criptográfica correta, etc. E depois **desencripta a resposta** e a processa.
155
+
156
+
<imgsrc="/img/deployment/https/https07.svg">
157
+
158
+
O cliente (navegador) saberá que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o **certificado HTTPS** anterior.
159
+
160
+
### Múltiplas Aplicações
161
+
162
+
Podem existir **múltiplas aplicações** em execução no mesmo servidor (ou servidores), por exemplo: outras APIs ou um banco de dados.
163
+
164
+
Apenas um processo pode estar vinculado a um IP e porta (o Proxy de Terminação TLS, por exemplo), mas outras aplicações/processos também podem estar em execução no(s) servidor(es), desde que não tentem usar a mesma **combinação de IP público e porta**.
165
+
166
+
<imgsrc="/img/deployment/https/https08.svg">
167
+
168
+
Dessa forma, o Proxy de Terminação TLS pode gerenciar o HTTPS e os certificados de **múltiplos domínios**, para múltiplas aplicações, e então transmitir as requisições para a aplicação correta em cada caso.
169
+
170
+
### Renovação de Certificados
171
+
172
+
Em algum momento futuro, cada certificado irá **expirar** (aproximadamente 3 meses após a aquisição).
173
+
174
+
E então, haverá outro programa (em alguns casos pode ser o próprio Proxy de Terminação TLS) que irá interagir com o Let's Encrypt e renovar o(s) certificado(s).
175
+
176
+
<imgsrc="/img/deployment/https/https.svg">
177
+
178
+
Os **certificados TLS** são **associados com um nome de domínio**, e não a um endereço IP.
179
+
180
+
Então para renovar os certificados, o programa de renovação precisa **provar** para a autoridade (Let's Encrypt) que ele realmente **possui e controla esse domínio**>
181
+
182
+
Para fazer isso, e acomodar as necessidades de diferentes aplicações, existem diferentes opções para esse programa. Algumas escolhas populares são:
183
+
184
+
***Modificar alguns registros DNS**
185
+
* Para isso, o programa de renovação precisa ter suporte as APIs do provedor DNS, então, dependendo do provedor DNS que você utilize, isso pode ou não ser uma opção viável.
186
+
***Executar como um servidor** (ao menos durante o processo de aquisição do certificado) no endereço IP público associado com o domínio.
187
+
* Como dito anteriormente, apenas um processo pode estar ligado a uma porta e IP específicos.
188
+
* Essa é uma dos motivos que fazem utilizar o mesmo Proxy de Terminação TLS para gerenciar a renovação de certificados ser tão útil.
189
+
* Caso contrário, você pode ter que parar a execução do Proxy de Terminação TLS momentaneamente, inicializar o programa de renovação para renovar os certificados, e então reiniciar o Proxy de Terminação TLS. Isso não é o ideal, já que sua(s) aplicação(ões) não vão estar disponíveis enquanto o Proxy de Terminação TLS estiver desligado.
190
+
191
+
Todo esse processo de renovação, enquanto o aplicativo ainda funciona, é uma das principais razões para preferir um **sistema separado para gerenciar HTTPS** com um Proxy de Terminação TLS em vez de usar os certificados TLS no servidor da aplicação diretamente (e.g. com o Uvicorn).
192
+
193
+
## Recapitulando
194
+
195
+
Possuir **HTTPS** habilitado na sua aplicação é bastante importante, e até **crítico** na maioria dos casos. A maior parte do esforço que você tem que colocar sobre o HTTPS como desenvolvedor está em **entender esses conceitos** e como eles funcionam.
196
+
197
+
Mas uma vez que você saiba o básico de **HTTPS para desenvolvedores**, você pode combinar e configurar diferentes ferramentas facilmente para gerenciar tudo de uma forma simples.
198
+
199
+
Em alguns dos próximos capítulos, eu mostrarei para você vários exemplos concretos de como configurar o **HTTPS** para aplicações **FastAPI**. 🔒
0 commit comments