10.11. HTTPS – encriptação de transporte para o servidor

Até agora tudo tem sido HTTP simples na porta 80. Qualquer pessoa que consiga capturar pacotes entre o browser e a câmara pode ler a palavra-passe do formulário de início de sessão, o cookie de sessão que é devolvido, o JWT no cabeçalho Authorization e os bytes JPEG de cada fotograma capturado. O HTTPS encripta a ligação 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 ficheiros para a câmara no formato correto – é abordado em Trabalhar com certificados TLS. Esta página trata de ligar um certificado já carregado ao microdot.

10.11.1. Construir o contexto SSL

ssl.SSLContext é o contentor da biblioteca padrão para certificado, chave e opções de protocolo. Para um servidor, utilize PROTOCOL_TLS_SERVER e carregue uma cadeia de certificados a partir do sistema de ficheiros da câmara:

import ssl

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

Os caminhos DER provêm do fluxo de trabalho que executou na secção TLS – autoassinado para desenvolvimento, assinado por CA para produção. Os ficheiros não têm de estar em /flash; /sdcard funciona igualmente bem.

10.11.2. Passar o contexto para start_server

A única diferença relativamente à chamada anterior de start_server() é o argumento ssl=ctx e o número de porta. A porta 443 é o valor predefinido do HTTPS, o que significa que os browsers não precisam de escrever :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())

É tudo do lado do servidor. Todas as rotas existentes – /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, o dashboard estático – passam agora a funcionar sobre TLS sem quaisquer outras alterações de código.

10.11.4. O que não está coberto aqui

HTTP Strict Transport Security (HSTS), renovação automática de certificados, a cadeia de confiança da CA no lado da câmara para pedidos de saída e a escolha de conjuntos de cifras estão todos na secção TLS. O elemento de ligação aqui – um SSLContext, um ssl=ctx – é a única parte específica do microdot.

A barra de URL do dashboard passa agora de http:// para https:// e o WebSocket de ws:// para wss:// – o JavaScript do dashboard já escolhe o esquema correto com base em location.protocol, pelo que não são necessárias alterações no cliente.

A câmara serve sobre HTTPS. O formulário de início de sessão, o JWT e os fotogramas capturados são encriptados em trânsito.