J'essaie d'accéder à un service Web SOAP hébergé publiquement (pas à WCF) via https, et je reçois une erreur que je n'ai jamais vue auparavant. Tout d'abord, voici les faits:Comment forcer le client WCF à envoyer un certificat client?
- Ce service nécessite des certificats clients. 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 faire dans Internet Explorer. IE affiche la fenêtre "Choisir un certificat", et si je la sélectionne (et ignore l'erreur de certificat serveur-nom-d'hôte-ne-concordance-pas), elle continue et me donne une erreur HTTP 500.
- Si j'ouvre le site dans Chrome, après avoir choisi le CERT et ignoré l'erreur, je reçois un message d'erreur normal à propos de WSA 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 n'a pas pu valider mon certificat. Il ne m'a jamais demandé d'en choisir un, alors c'est tout à fait logique.
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 des indices manquant quant à ce qui se passe . Ici, cependant, est ce que je vois:
- C -> S client Bonjour
- Contient des choses comme un nombre aléatoire, date/heure, suites cypher pris en charge, etc
- S - > C serveur Bonjour, certificat, demande de certificat, serveur Bonjour Fait
- Contient le certificat du serveur, et une demande de certificat client
- C -> Certificat S, Key Exchange client, changement Cipher Spec, Encrypted Handshake message
- VOICI LE INTÉRESSANT PARTIE - La première partie de ce paquet est la poignée de main de certificat, où je suppose que le certificat client serait être, mais il n'y a aucun certificat présent (longueur des certificats: 0).
- S -> C Alert (Niveau: Fatal, Description: Bad certificat)
- Eh bien, oui, il n'y avait pas de certificat envoyé.
Ma liaison est mis en place 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 critère d'évaluation est configuré pour utiliser à la fois la liaison et le comportement. Pourquoi WCF refuse-t-il d'envoyer le certificat lorsqu'il crée la connexion https?
Je déteste tellement la WCF. Cette solution a fonctionné pour moi, merci tas - mais tout est si fastidieux. Tue moi maintenant. – robnick