Por que WCF reclamar sobre falha de verificação de identidade?
-
06-07-2019 - |
Pergunta
Eu estou criando um aplicativo WCF onde eu vou estar usando certificados para criptografar a comunicação entre o cliente eo servidor. No meu ambiente de desenvolvimento, eu quero usar um certificado auto-assinado certificado de teste / que eu criei usando makecert. (Apenas o servidor irá ter um certificado, o cliente não vai).
Eu instalei o certificado em um armazenamento de certificados, e tudo está funcionando bem. No cliente, certificateValidationMode é definido como "false", desde que eu estou trabalhando com um certificado de teste.
Meu problema:
No app.config no cliente, eu preciso especificar o elemento identidade como esta:
<endpoint ... >
<identity>
<dns value="<Name-Of-Server-Computer>"/>
</identity>
</endpoint>
Se eu remover o elemento de identidade, recebo a seguinte mensagem de erro no cliente quando tento conectar ao servidor:
verificaçãoIdentidade falhou por mensagem de saída. A identidade DNS espera do terminal remoto foi 'localhost', mas o ponto final fornecido reivindicação DNS remoto 'Nome-do-Server-computador'. Se este é um ponto de extremidade remoto legítimo, você pode corrigir o problema, especificando explicitamente identidade DNS 'Nome-do-Server-Computador' como a propriedade de identidade de EndpointAddress ao criar procuração canal.
Então aqui vai minhas perguntas:
-
O controlo de identidade feito somente quando utilizar um certificado de teste / auto-assinado? Quando eu implantar o meu aplicativo usando um real, confiável, certificado comprado de uma CA, vai a verificação de identidade ainda ser feita?
-
Existe uma maneira para desativar a verificação de identidade? Eu sei que posso criar meu próprio certificado personalizado validador, mas não parece ser uma maneira de substituir o controlo de identidade usando estas.
Solução
A verificação é feita sempre - e deve ser. Basicamente, WCF irá verificar que o certificado é emitido para o nome de domínio (yourcompany.com) ou nome da máquina onde seus reside serviço. Esta é uma verificação de segurança que eu nunca tinha disable! Caso contrário, qualquer um spoofing seu serviço poderia usar qualquer certificado feita para um nome de domínio / máquina arbitrária e obter o seu tráfego - não o que você quer
Então, o que você precisa ter certeza é que o seu certificado real no servidor de produção é realmente emitido para o nome de domínio que o servidor de produção será parte de, por exemplo, se o seu servidor de produção vai ser em "production.yourcompany.com", as necessidades de certificado a ser feita para esse domínio.
Marc
Outras dicas
A resposta a esta pergunta está na própria mensagem de erro. No cliente você pode fazer:
EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server");
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity);
Substitua o "servidor", por tudo o que é esperado. Normalmente, este seria o nome comum (CN) do certificado auto-assinado. Se o fizer, não de segurança ruína, desde que você tome toda a responsabilidade por garantir que o certificado apresentado é válido, isto é, criar o seu certificado personalizado validador e fazer verificações relevantes lá.
certificateValidationMode deve ser definido como "None", não "false" ...