(Postado em ServerFault em vez de StackOverflow porque sinto que diz respeito mais à configuração do sistema operacional do que ao código de programação).
Atualmente sou responsável pela manutenção de um sistema que se conecta a um webservice de terceiros. Este webservice requer certificados de autenticação do cliente, o que é bastante justo, mas o próprio webservice é protegido com um certificado autoassinado criado por um certificado de autoridade de certificação raiz autocriado - a mesma raiz que cria os certificados de autenticação do cliente.
Seria suficiente apenas adicionar o certificado de serviço atual à lista de confiança conhecida e ignorar o certificado de autoridade autocriado, infelizmente o certificado de serviço muda regularmente, então o certificado de autoridade deve ser confiável para garantir que o aplicativo não seja interrompido quando o certificado de serviço é renovado.
No entanto, eu não confio (pessoalmente) no certificado CA com base em minha experiência com a empresa que executa o serviço da web - não me surpreenderia se vazasse para a web - e, preocupantemente, o certificado CA não tem restrições de uso de chave colocadas em (embora ataques MITM externos sejam uma possibilidade, embora remota, estou mais preocupado com um certificado vazado usado para assinatura de código, por exemplo).
É possível para mim dizer ao meu computador (atualmente uma caixa de servidor, mas no futuro caixas de clientes de desktop comuns) para confiar em uma CA, mas apenas para um determinado conjunto de usos de chave e um pequeno conjunto de possíveis nomes de assunto (nomes de domínio )?
Atualmente, o servidor é o Windows Server 2012 R2, mas pode ser executado em uma caixa Linux - embora as máquinas desktop sejam todas caixas Windows.
Sim, é possível. No caso do Windows, existe um recurso chamado de Certificação Cruzada ou Subordinação Qualificada.
A ideia é que você assine o certificado CA emissor de terceiros em seu ambiente. Como resultado, o certificado SSL remoto é encadeado ao seu próprio certificado CA raiz. Para se proteger de possíveis certificados não autorizados, você implementa uma
Name Constraints
extensão de certificado onde especifica uma lista de nomes aceitáveis. Se CA de terceiros emitir certificado para qualquer outro nome (não explicitamente especificado na extensão Name Constraints), ele será automaticamente rejeitado por seu provedor CryptoAPI.Além das restrições de nome, você pode descrever a restrição Enhanced Key Usages definindo a
Application Policies
extensão do certificado no arquivo cross-certificate. Portanto, seu provedor de confiança validará com êxito apenas os usos especificados naApplication Policies
extensão.Mais informações: Planejamento e implementação de certificação cruzada e subordinação qualificada usando o Windows Server 2003
ps embora o artigo seja escrito no Windows Server 2003, o artigo ainda se aplica à versão mais recente do Windows Server.