Compartilhar via


Exemplo de segurança de descoberta

A especificação de descoberta não exige que os pontos de extremidade que participam do processo de descoberta sejam seguros. Aprimorar as mensagens de descoberta com segurança mitiga vários tipos de ataques (alteração de mensagem, negação de serviço, replay, spoofing).

O exemplo DiscoveryScenario implementa canais personalizados que calculam e verificam assinaturas de mensagens usando o formato de assinatura compacto (descrito na Seção 8.2 da especificação WS-Discovery). O exemplo é compatível com a especificação do Discovery 2005 e a versão 1.1.

O canal personalizado é aplicado sobre a pilha de canais existente para pontos de extremidade de descoberta e anúncio. Dessa forma, um cabeçalho de assinatura é aplicado para cada mensagem enviada. A assinatura é verificada nas mensagens recebidas e quando não corresponde ou quando as mensagens não possuem assinatura, as mensagens são descartadas. Para assinar e verificar mensagens, o exemplo usa certificados.

Discussão

O WCF é extensível e permite que os usuários personalizem os canais conforme desejado. O exemplo implementa um elemento de associação segura de descoberta que cria canais seguros. Os canais seguros aplicam e verificam assinaturas de mensagens e são aplicados no topo da pilha atual.

O elemento de associação segura cria fábricas de canal seguro e ouvintes de canal.

Fábrica de canais seguros

A fábrica de canais seguros cria canais de saída ou duplex que adicionam uma assinatura compacta aos cabeçalhos das mensagens. Para manter as mensagens o menor possível, o formato de assinatura compacto é usado. A estrutura de uma assinatura compacta é mostrada no exemplo a seguir.

<d:Security ... >
  [<d:Sig Scheme="xs:anyURI"
         [KeyId="xs:base64Binary"]?
          Refs="..."
         [PrefixList]="xs:NMTOKENS"
          Sig="xs:base64Binary"
          ... />]?
  ...
</d:Security>

Observação

PrefixList foi adicionado ao protocolo da versão 2008 Discovery.

Para computar a assinatura, o exemplo determina os itens de assinatura expandidos. Uma assinatura XML (SignedInfo) é criada, usando o prefixo de namespace ds, conforme exigido pela especificação WS-Discovery. O corpo e todos os cabeçalhos nos namespaces de descoberta e endereçamento são referenciados na assinatura, portanto, eles não podem ser adulterados. Cada elemento referenciado é transformado usando a canonicalização exclusiva (http://www.w3.org/2001/10/xml-exc-c14n#) e, em seguida, um valor de síntese SHA-1 é calculado (http://www.w3.org/2000/09/xmldsig#sha1). Com base em todos os elementos referenciados e seus valores de resumo, o valor da assinatura é calculado usando o algoritmo RSA (http://www.w3.org/2000/09/xmldsig#rsa-sha1).

As mensagens são assinadas com um certificado especificado pelo cliente. O local do armazenamento, o nome e o nome do assunto do certificado devem ser especificados quando o elemento de associação é criado. O KeyId na assinatura compacta representa o identificador de chave do token de assinatura e é o Subject Key Identifier (SKI) do token de assinatura ou (se o SKI não existir) um hash SHA-1 da chave pública do token de assinatura símbolo.

Ouvinte de canais seguro

O ouvinte de canais seguro cria canais de entrada ou duplex que verificam a assinatura compacta nas mensagens recebidas. Para verificar a assinatura, o KeyId especificado na assinatura compacta anexada à mensagem é usado para selecionar um certificado do armazenamento especificado. Se a mensagem não tiver uma assinatura ou a verificação de assinatura falhar, as mensagens serão descartadas. Para usar a associação segura, o exemplo define uma fábrica que cria UdpDiscoveryEndpoint e UdpAnnouncementEndpoint customizados com o elemento de associação segura de descoberta incluído. Esses terminais seguros podem ser usados em ouvintes de anúncios de descoberta e serviços detectáveis.

Detalhes de exemplo

O exemplo inclui uma biblioteca e 4 aplicativos de console:

  • DiscoverySecurityChannels: uma biblioteca que expõe a associação segura. A biblioteca calcula e verifica a assinatura compacta para mensagens de entrada/saída.

  • Serviço: um serviço que expõe o contrato ICalculatorService, auto-hospedado. O serviço é marcado como detectável. O usuário especifica os detalhes do certificado usado para assinar mensagens especificando o local e o nome do repositório, o nome do assunto ou outro identificador exclusivo para o certificado, e o repositório onde os certificados do cliente estão localizados (os certificados usados para verificar a assinatura das mensagens recebidas). Com base nesses detalhes, um UdpDiscoveryEndpoint com segurança adicional é criado e usado.

  • Cliente: esta classe tenta descobrir um ICalculatorService e chamar métodos no serviço. Novamente, um UdpDiscoveryEndpoint com segurança adicional é criado e usado para assinar e verificar as mensagens.

  • AnnouncementListener: um serviço auto-hospedado que escuta anúncios on-line e off-line e usa o ponto de extremidade de anúncio seguro.

Observação

Se Setup.bat for executado várias vezes, o gerenciador de certificados solicitará que você escolha um certificado a ser adicionado, pois há certificados duplicados. Nesse caso, Setup.bat deve ser abortado e Cleanup.bat deve ser chamado, pois as duplicatas já foram criadas. O Cleanup.bat também solicita que você escolha um certificado a ser excluído. Selecione um certificado da lista e continue executando o Cleanup.bat até que não haja mais certificados.

Para usar este exemplo

  1. Execute o script Setup.bat de um prompt de comando do desenvolvedor para Visual Studio. O exemplo usa certificados para assinar e verificar mensagens. O script cria os certificados usando Makecert.exe e os instala usando Certmgr.exe. O script deve ser executado com privilégios de administrador.

  2. Para compilar e executar o exemplo, abra o arquivo Security.sln no Visual Studio e escolha Rebuild All. Atualize as propriedades da solução para iniciar vários projetos: selecione Iniciar para todos os projetos, exceto DiscoverySecureChannels. Execute a solução normalmente.

  3. Após concluir o exemplo, execute o script Cleanup.bat que remove os certificados criados para este exemplo.