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:
- C -> S Client Hello
- Contient des choses comme un nombre aléatoire, date/heure, cypher suites pris en charge, etc
- 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
- 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).
- 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
Vous devez vous connecter pour publier un commentaire.
J'ai résolu le problème, mais je ne comprends pas pourquoi ce changement de configuration fixe. J'ai modifié cette ligne:
:
et comme par magie il a commencé à travailler. J'avais compris que la
requireClientCertificate
"bouton" est pour le côté serveur, donc je n'avais pas essayé lors de ma proie. Apparemment, j'avais tort.OriginalL'auteur Mark
Il devrait y avoir une CertificateRequest à partir du serveur de nommage acceptable cert types et des Ar. Si votre certificat ne correspond pas à ceux qu'il ne sera pas envoyé.
Si tout cela est vrai, il y aurait eu un Certificat de message de la part du client après la CertificateRequest à partir du serveur. La conclusion inévitable est que certains de il n'est pas vrai. Vous avez besoin de vérifier deux fois plus de tout: plus précisément, que le certificat (un) est disponible à la demande et (b) est conforme à toutes les contraintes exprimées dans le CertificateRequest.
C'est vérifiable, c'est vrai... j'ai la capture WireShark ici. J'ai fini de résoudre le problème, cependant, mais je ne comprends vraiment pas pourquoi ce que j'ai changé fixe. Je vais poster une réponse distincte.
C'est vérifiable vrai que vous avez obtenu le CertificateRequest message et que vous n'avez pas à envoyer un Certificat. C'est ce que votre dump ci-dessus montre. S'il y avait eu un Certificat client message, il serait apparu en réponse à la demande.
Oui, c'est ce que j'ai dit. Toute la question se résume à "le serveur a demandé un certificat client, pourquoi ne pas WCF envoyer une?"
OriginalL'auteur user207421
Il pourrait être un problème de négociation de protocole de sécurité à utiliser. Plus précisément im pensant que le serveur peut ne pas aimer la WCF en essayant d'utiliser TLS 1.0.
Pour voir si c'est le cas, essayez d'ajouter les éléments suivants avant d'appeler le service
Cela pourrait être ajouté dans le code client ou en le plaçant dans un IEndpointBehavior
Pas si l'échange a gagné un ChangeCipherSpec message. Cela signifie que tout sur le protocole qui a été convenu.
OriginalL'auteur magnus