Comment faire pour forcer la WCF client pour l'envoi de certificat client?

J'essaye d'accéder à un public hébergé par web service SOAP (pas WCF) sur https, et j'obtiens une erreur que je n'ai jamais vu avant. Tout d'abord, voici les faits:

  • Ce service exige des certificats client. J'ai un certificat qui est signé par la même autorité de certification que le certificat du serveur.
  • Je sais que l'URL est disponible, comme je peux le frapper dans Internet Explorer. IE affiche "choisir le certificat" de la fenêtre, et si je le ramasser (et ignorer le serveur-host-nom-ne-pas-match-certificat d'erreur), il se passe et me donne une erreur HTTP 500.
  • Si j'ouvre le site dans google Chrome, après avoir récupéré le cert et en ignorant l'erreur, j'obtiens un message d'erreur normal sur l'ASM Action = null.
  • Si j'ouvre le site dans FireFox, après avoir ignoré l'erreur, j'obtiens une page sur la façon dont le serveur ne pouvait pas valider mon certificat. Il ne m'a jamais demandé d'en choisir un, de sorte que le sens parfait.

Maintenant, à l'exception:

Error occurred while executing test 12302: System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure channel for SSL/TLS with authority 'ihexds.nist.gov:9085'. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
   at System.Net.HttpWebRequest.GetResponse()
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)

J'ai retracé l'interaction avec WireShark, mais parce que je ne suis pas un expert dans le protocole TLS, je pourrais être absent des indices quant à ce qu'il se passe. Ici, cependant, est ce que je vois:

  1. C -> S Client Hello
    • Contient des choses comme un nombre aléatoire, date/heure, cypher suites pris en charge, etc
  2. S -> C Serveur Bonjour, un Certificat, une Demande de Certificat de Serveur Bonjour Fait
    • Contient le certificat du serveur, et une demande pour un certificat du client
  3. C -> S Certificat, le Client Échange de Clé, Changement de Cipher Spec, Chiffré Handshake Message
    • VOICI LA PARTIE INTÉRESSANTE -- La première partie de ce paquet est le Certificat de poignée de main, où je suppose que le certificat du client serait, mais il n'existe pas de certificats (Certificats de Longueur: 0).
  4. S -> C Alerte (Niveau: Fatal, Description: Bad Certificat)
    • Eh bien, oui, il n'y a pas de certificat envoyé.

Ma liaison est défini comme suit:

<binding name="https_binding">
    <textMessageEncoding />
    <httpsTransport useDefaultWebProxy="false" />
</binding>

Mon comportement est défini comme suit:

<behavior name="clientcred">
    <clientCredentials>
        <clientCertificate findValue="69b6fbbc615a20dc272a79caa201fe3f505664c3" storeLocation="CurrentUser" storeName="My" x509FindType="FindByThumbprint" />
        <serviceCertificate>
            <authentication certificateValidationMode="None" revocationMode="NoCheck" />
        </serviceCertificate>
    </clientCredentials>
    <messageInspector />
</behavior>

Mon point de terminaison est configuré pour utiliser à la fois la liaison et le comportement. Pourquoi ne WCF refuser d'envoyer le certificat lorsqu'il crée la connexion https?

OriginalL'auteur Mark | 2010-11-03