Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A especificação de descoberta não exige que os pontos de extremidade que participam do processo de descoberta sejam seguros. Melhorar as mensagens de descoberta com medidas de segurança mitiga vários tipos de ataques (alteração de mensagem, negação de serviço, reprodução não autorizada, falsificação).
O exemplo DiscoveryScenario implementa canais personalizados que calculam e verificam assinaturas de mensagem usando o formato de assinatura compacta (descrito na Seção 8.2 da especificação WS-Discovery). O exemplo dá suporte à especificação 2005 Discovery e à 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 a cada mensagem enviada. A assinatura é verificada nas mensagens recebidas e quando ela não corresponde ou quando as mensagens não têm uma assinatura, as mensagens são descartadas. Para assinar e verificar mensagens, o exemplo usa certificados.
Discussão
O WCF é extensível e permite aos usuários a possibilidade de personalizar 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 de mensagem. Para manter as mensagens o menor possível, o formato de assinatura compacta é 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
O PrefixList foi adicionado no protocolo de versão do Discovery de 2008.
Para calcular a assinatura, a amostra determina os itens de assinatura expandidos. Uma assinatura XML (SignedInfo) é criada usando o prefixo de ds namespace, 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 manipulados. Cada elemento referenciado é transformado usando a Canonicalização Exclusiva (http://www.w3.org/2001/10/xml-exc-c14n#) e, em seguida, um valor de resumo SHA-1 é computado (http://www.w3.org/2000/09/xmldsig#sha1). Com base em todos os elementos referenciados e em seus valores de resumo, o valor da assinatura é computado 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 da loja, o nome e o assunto do certificado devem ser especificados quando o elemento de vínculo é criado. O KeyId na assinatura compacta representa o identificador de chave do token de assinatura e é o Identificador de Chave de Assunto (SKI) do token de assinatura ou (se o SKI não existir) um hash SHA-1 da chave pública do token de assinatura.
Ouvinte de Canal Seguro
O ouvinte de canais seguro cria canais de entrada ou duplex que verificam a assinatura compacta nas mensagens recebidas. Para verificar a assinatura, a KeyId especificada na assinatura compacta anexada à mensagem é usada para selecionar um certificado do repositório 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 quatro aplicativos de console:
DiscoverySecurityChannels: uma biblioteca que expõe a associação segura. A biblioteca calcula e verifica a assinatura compacta para mensagens de saída/entrada.
Serviço: um serviço que expõe o contrato ICalculatorService, hospedado de forma autônoma. O serviço é marcado como detectável. O usuário especifica os detalhes do certificado usado para assinar mensagens, informando a localização e o nome do repositório, além do nome da entidade ou outro identificador exclusivo para o certificado. O usuário também especifica o repositório onde os certificados do cliente estão localizados (os certificados usados para verificar a assinatura de mensagens de entrada). Com base nesses detalhes, um UdpDiscoveryEndpoint com segurança adicional é criado e usado.
Cliente: essa classe tenta descobrir um ICalculatorService e chamar métodos no serviço. Novamente, uma UdpDiscoveryEndpoint com segurança adicional é criada e usada 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. Cleanup.bat também solicita que você escolha um certificado a ser excluído. Selecione um certificado na lista e continue executando Cleanup.bat até que nenhum certificado permaneça.
Para usar este exemplo
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.
Para compilar e executar o exemplo, abra o arquivo Security.sln no Visual Studio e escolha Recompilar Tudo. Atualize as propriedades da solução para iniciar vários projetos: selecione Iniciar para todos os projetos, exceto DiscoverySecureChannels. Execute a solução normalmente.
Depois de terminar o exemplo, execute o script Cleanup.bat que remove os certificados criados para este exemplo.