Eu sou novo nesta comunidade e em coisas relacionadas à segurança.
tenho tres servidores
- Servidor Web (Cliente)
- Servidor de e-mail (eSMTP)
- Servidor web
Todos os servidores têm seus próprios certificados SSL e foram solicitados a fazer o seguinte:
O servidor Web (cliente) deve fazer solicitações seguras a outros dois servidores com TLS e aceitar apenas os certificados desses servidores e nada mais. Existe uma maneira de configurar isso no openssl? Meu problema é que os certificados são locais/autoassinados.
O servidor cliente é um RHEL 7.
A prática sobre a qual você está falando é chamada de "Fixação de certificado" (ou às vezes "Fixação de chave pública") e é uma recomendação de segurança comum quando você controla o cliente e o servidor.
Normalmente, isso é feito configurando o código do cliente TLS (que pode ser OpenSSL ou alguma outra biblioteca) para introduzir uma etapa personalizada de validação de certificado (normalmente uma função a ser chamada quando a conexão está sendo estabelecida) e nessa etapa você verifica se o certificado apresentado pelo servidor corresponde ao que você esperava. Você pode querer consultar https://stackoverflow.com/questions/16291809/programmatically-verify-certificate-chain-using-openssl-api ou https://stackoverflow.com/questions/3412032/how-do-you- check-a-public-key-was-issued-by-your-private-ca para exemplos de código para fazer isso (embora sejam antigos e possam estar desatualizados); A API do OpenSSL é muito fácil de cometer erros.
Você também pode querer ler https://labs.nettitude.com/tutorials/tls-certificate-pinning-101/ ou similar, que fala sobre as considerações ao fazer a fixação. Em particular, você deseja considerar coisas como qual certificado você fixa (um certificado de folha específico, a CA raiz ou algo entre) e quanto do certificado você fixa (fixar o certificado inteiro parece fácil, mas complica a reemissão do certificado com novas datas ou OIDs ou similares, enquanto simplesmente fixar detalhes de chave pública fornece toda a segurança que você realmente precisa na maioria dos casos). Você também deve considerar um pino de backup / fallback, para facilitar a rotação do certificado caso seu certificado principal seja comprometido e precise ser revogado.
Com tudo isso dito, pode haver outra opção neste caso. Se o seu cliente (que também é um servidor) só vai se conectar a este outro servidor e você usa uma CA interna, você pode configurar o código do cliente TLS para usar um "pacote" de CA contendo apenas o certificado da CA interna, em vez de usar o pacote CA de todo o sistema. Isso permite que você continue usando o código de validação de certificado padrão, ele simplesmente não confiará em nenhum certificado que não se encadeie com sua CA interna. Na verdade, isso é o mesmo que fixar no nível da CA, mas potencialmente muito mais simples (embora com menos controle sobre a lógica de validação).