WCF - não consegue localizar o certificado X.509 usando os seguintes critérios de pesquisa

StackOverflow https://stackoverflow.com/questions/1134055

  •  16-09-2019
  •  | 
  •  

Pergunta

Ok, eu vi várias perguntas relacionadas a este assunto, e eu tentei um monte de idéias apresentadas neles sem sucesso. Aqui está a minha situação:

Eu estou batendo um serviço web através da intranet da minha empresa. Eu tenho usado svcutil.exe para gerar a classe do cliente para WCF. Eu era capaz de executar a chamada de serviço web com nenhum problema quando o serviço estava em desenvolvimento e não exigir credenciais de autenticação, então eu sei o código funciona. Na época, o código estava correndo através de SSL. Eu importado o certificado exigido para a Certificação Raiz Confiáveis ??Autoridades, e estava tudo bem.

Nós apenas mudou-se para um ambiente de palco, eo serviço foi atualizado para exigir credenciais para se conectar. Troquei a minha ligação com o novo ponto final, e acrescentou código para autenticar. Esta é a minha primeira vez trabalhando com o WCF, por isso, tenha comigo sobre quaisquer erros óbvios. Meu problema é que eu não posso localizar o certificado via código para passar ao serviço de autenticação. Estou baseando esta fora de alguns exemplos de código on-line que eu encontrei.

Aqui está um exemplo de minha configuração gerado pelo svcutil:

<system.serviceModel>
  <bindings>
   <basicHttpBinding>
    <binding 
        name="xxxSOAPBinding" 
        .... (irrelevant config settings)....
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <security mode="Transport">
      <transport clientCredentialType="Certificate" />
     </security>
    </binding>
   </basicHttpBinding>
  </bindings>
  <client>
   <endpoint address="https://xxxServices_1_0_0"
    binding="basicHttpBinding" bindingConfiguration="xxxSOAPBinding" 
    contract="xxxService" name="xxxService" />
  </client>
 </system.serviceModel>

E aqui está o código que estou usando para tentar se conectar. A exceção é lançada assim que eu tentar localizar o certificado:

using (var svc = new xxxServiceClient())
{
    svc.ClientCredentials.UserName.UserName = "XXX";
    svc.ClientCredentials.UserName.Password = "XXX";

    svc.ClientCredentials.ClientCertificate
     .SetCertificate(StoreLocation.LocalMachine, StoreName.Root, 
                     X509FindType.FindBySubjectName, "xxx");
...
}

Eu tentei várias X509FindTypes diferentes, e combinados com os valores na cert sem sucesso. Existe errado alguma coisa com o meu código? Existe outra maneira eu posso consultar a loja cert para validar os valores que eu estou passando?

A máquina dev onde estou executando o Visual Studio teve o certificado importado.

Foi útil?

Solução

perguntas Dois tolas:

  • você certeza o seu certificiate está instalado em tudo?
  • isto é uma certificiate especificamente para esta máquina de teste?

Além disso, parece um pouco estranho que você está em primeiro lugar ajuste nome de usuário / senha, e depois também definir a credencial. você pode comentar a parte nome de usuário / senha? Isso faz alguma diferença?

Marc

Outras dicas

Tem certeza que o certificado foi importado para o armazenamento do computador local, que poderia ser na loja CurrentUser.

Isto pode soar estúpido, mas você está certo de que o novo certificado para o serviço de teste foi instalado em sua loja cert? Isso é provavelmente o seu problema.

Além disso, desde que você não mencionou que exceção é lançada, é possível que o problema é que você definiu as credenciais de nome de usuário / senha antes de definir credenciais ClientCertificate, quando a sua ligação não indica o uso de nome de usuário / senha. Poderia ser um problema lá; eles são mutuamente exclusivos, IIRC.

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