Autenticação customizada de WCF – Parte II

Olá pessoal,

No post anterior da nossa série, Autenticação customizada de WCF – Parte I, mostrei como criar uma classe para autenticar as informações de usuário e senha, ficando pendente como trafegar estas informações de maneira segura, através do uso de certificados. Exatamente o assunto do post de hoje.

O primeiro passo é conseguir o certificado para ser utilizado na configuração do serviço. Uma opção para ambientes de produção é comprar um certificado de uma entidade certificadora, uma outra opção é gerar um certificado através do Certificate Server, uma das funcionalidade do Windows Server. Já para ambientes de desenvolvimento uma abordagem interessante pode ser gerar certificados de teste (acho que ficou claro) utilizando a ferramenta makecert.

Com o makecert é necessário primeiro criar um certificado Root, utilizado na geração de outros certificados. Para isto, o comando abaixo deve ser executado no prompt de comando:

makecert -n "CN=RootCATest" -r -sv RootCATest.pvk RootCATest.cer

Depois de gerar o certificado Root, precisamos instalá-lo no computador. O que deve ser feito no Snap-in de certificados para o computador local do MMC na pasta Trusted Root Certification Authorities, conforme imagem abaixo:

image

Com o certificado Root instalado, podemos utilizá-lo para gerar o certificado que irá efetivamente proteger a comunicação entre o cliente e o serviço. Para isto, o comando abaixo deve ser executado no prompt de comando:

makecert -sk localhost -iv RootCATest.pvk -n "CN=localhost" -ic RootCATest.cer -sr localmachine -ss trustedPeople -sky exchange -pe

Notem que o comando acima cria e instala o certificado na pasta Trusted People, sem necessidade de instalação manual.

Agora que os certificados foram criados e instalados, precisamos configurar o serviço e o cliente para utilizá-los. O serviço deve ser configurado utilizando a tag serviceCertificate, conforme exemplo abaixo:

    1:  <behaviors>
    2:      <serviceBehaviors>
    3:          <behavior name="WCFService.CalculatorServiceBehavior">
    4:              <serviceMetadata httpGetEnabled="True"/>
    5:              <serviceDebug includeExceptionDetailInFaults="False" />
    6:              <serviceCredentials>
    7:                  <userNameAuthentication userNamePasswordValidationMode="Custom"  customUserNamePasswordValidatorType="WCFCustomAuthentication.CustomUsernamePasswordValidator, WCFCustomAuthentication"/>
    8:                  <serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="TrustedPeople"/>
    9:              </serviceCredentials>
   10:          </behavior>
   11:      </serviceBehaviors>
   12:  </behaviors>

Já a configuração do cliente deve ficar similar ao código xml abaixo:

    1:  <behaviors>
    2:      <endpointBehaviors>
    3:          <behavior name="ClientCertificateBehaviour">
    4:              <clientCredentials>
    5:                  <serviceCertificate>
    6:                      <authentication certificateValidationMode="PeerOrChainTrust"/>
    7:                  </serviceCertificate>
    8:              </clientCredentials>
    9:          </behavior>
   10:      </endpointBehaviors>
   11:  </behaviors>

Notem que o cliente foi configurado para validar o serviço como PeerOrChainTrust, o que significa que primeiro ele vai verificar se confia no próprio certificado e se não conseguir tenta validar a cadeia hierárquica até chegar no certificado Root. O modelo mais seguro é a validação através da hierarquia (ChainTrust), entretanto isto não é possível com certificados criados utilizando a ferramenta makecert, somente com certificados comerciais.

Posts da série: