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ção

Identidade 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.

Foi útil?

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" ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top