10.11. HTTPS – criptografia de transporte para o servidor

Até agora tudo tem sido HTTP simples na porta 80. Qualquer pessoa com uma captura de pacotes entre o navegador e a câmera pode ler a senha do formulário de login, o cookie de sessão que vem de volta dele, o JWT no cabeçalho Authorization e os bytes JPEG de cada quadro capturado. O HTTPS criptografa o tráfego de ponta a ponta.

O fluxo de trabalho do certificado em si – gerar um certificado autoassinado para desenvolvimento, obter um certificado assinado por uma CA para produção, copiar os arquivos para a câmera no formato correto – é abordado em Trabalhando com certificados TLS. Esta página trata de conectar um certificado já carregado ao microdot.

10.11.1. Construindo o contexto SSL

ssl.SSLContext é o contêiner da biblioteca padrão para o certificado, a chave e as opções de protocolo. Para um servidor, você quer PROTOCOL_TLS_SERVER e uma cadeia de certificados carregada a partir do sistema de arquivos da câmera:

import ssl

ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('/flash/cert.der', '/flash/key.der')

Os caminhos DER vêm de qualquer fluxo de trabalho que você executou na seção TLS – autoassinado para desenvolvimento, assinado por CA para produção. Os arquivos não precisam estar em /flash; /sdcard funciona igualmente bem.

10.11.2. Passe o contexto para start_server

A única diferença em relação à chamada anterior de start_server() é o argumento ssl=ctx e o número da porta. A porta 443 é o padrão do HTTPS, o que significa que os navegadores não precisam digitar :443 – basta https://yard-cam.local/:

async def main():
    await asyncio.gather(
        capture_loop(),
        motion_detector(),
        app.start_server(host='0.0.0.0', port=443, ssl=ctx),
    )

asyncio.run(main())

Isso é tudo do lado do servidor. Cada rota existente – /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, o painel estático – agora roda sobre TLS sem nenhuma outra alteração de código.

10.11.4. O que não é abordado aqui

HTTP Strict Transport Security (HSTS), a renovação automática de certificados, a cadeia de confiança da CA no lado da câmera para requisições de saída e a escolha de conjuntos de cifras vivem todos na seção TLS. A integração aqui – um SSLContext, um ssl=ctx – é a única peça específica do microdot.

A barra de URL do painel agora vai de http:// para https:// e o WebSocket de ws:// para wss:// – o JavaScript do painel já escolheu o esquema correto com base em location.protocol, então nenhuma alteração no cliente é necessária.

A câmera serve por HTTPS. O formulário de login, o JWT e os quadros capturados são criptografados em trânsito.