Minha rede contém um PC com Windows e dezenas de PCs incorporados rodando Linux. O cliente exige que a comunicação entre o PC e todos os terminais seja protegida.
No endpoint estou executando o servidor HTTP python:
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.check_hostname = False
context.load_cert_chain('certificate.pem', 'private.key')
server_address= ('10.0.0.2',1443)
httpd = HTTPServer (server_address, CustomHTTP)
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
httpd.serve_forever ()
Cada endpoint tem um IP diferente (é claro). Devo criar um certificado diferente para cada endpoint?
Depende dos requisitos do cliente.
Se o cliente quiser apenas proteção contra monitoramento passivo, então um certificado falso genérico sem qualquer verificação será suficiente.
Se o cliente desejar proteção contra monitoramento passivo e ataques ativos, cada endpoint deverá ter seu próprio certificado.
Com muitos endpoints, você deve criar uma CA local e usá-la para emitir certificados de dispositivos; então os clientes precisarão apenas de um
context.load_verify_locations("ca.crt")
para poder lidar com qualquer endpoint. SmallStep (step-ca) e Easy-RSA são duas ferramentas comumente usadas para isso.(E, claro, embora
check_hostname = False
esteja tudo bem no lado do servidor, os clientes não devem fazer isso ou isso enfraquece seriamente a proteção contra ataques ativos.)Esta questão é muito aberta à interpretação. No caso mais simples, se funcionar como qualquer serviço HTTPS típico na web, existem algumas opções.
Possivelmente, a "melhor" opção seria obter um certificado HTTPS válido para o servidor de uma CA conhecida cujo certificado de CA esteja no armazenamento de CA dos clientes. Você pode fazer isso mesmo dentro de uma rede privada - comprando um certificado e verificando-o por e-mail ou interagindo com DNS público (e você pode usar o LetsEncrypt gratuitamente). Claro, para que isso funcione, você precisa usar um nome de domínio válido (mesmo que aponte para endereços IP internos)
Uma alternativa seria executar sua própria CA e adicionar sua chave de CA a cada um dos clientes. Isso não é trivial, mas é muito viável com ferramentas gratuitas (como easy-rsa - que acredito estar/foi associado ao OpenVPN, mas é um sistema independente que funcionará perfeitamente para HTTPS). Novamente, você precisará de algum tipo de resolução de nomes para que isso funcione.
As 2 soluções acima pressupõem que os servidores confiem nos clientes. Se isso não estiver certo, você precisará acelerar o jogo. Existem pelo menos 2 maneiras de fazer isso -
Use algo como easy-rsa para criar uma CA e, em seguida, crie e valide certificados do lado do cliente. Isso exigirá suporte do servidor web. Além do cliente validar o servidor, ele também faz o inverso.
Abandone a ideia de HTTPS e, em vez disso, configure VPNs entre os dispositivos (e imponha a conectividade apenas por meio de conexões VPN). Isso criptografará tudo e poderá ser mais intuitivo do que configurar uma CA. Você pode usar algo tão simples/leve como o Wireguard - caso contrário, o OpenVPN também pode fazer isso.