Question

Bonjour, je rencontre des problèmes pour essayer de publier un WebRequest sous Https.

J'ai reçu les erreurs suivantes

1.-La connexion sous-jacente a été fermée: impossible de se connecter au serveur distant.

2.-l'opération TimeOut

3-La connexion sous-jacente était fermée: impossible d'établir un canal sécurisé pour SSL / TLS.

J'ai essayé avec environ 3 ou 4 mandataires différents de ma société et de la société du client, et même lorsque je suis directement avec le fournisseur d'accès Internet sans restrictions, j'obtiens les erreurs ci-dessus lors de l'exécution de la méthode suivante

WebRequest.GetRequestStream() 

cela se produit derrière un proxy ou non, la requête ne peut être postée avec succès que par un seul PC derrière un proxy. le proxy n'a pas de certificat client installé.

ceci est sous .net framework 1.1 et la demande contient déjà des informations d'identification réseau.

que pourrait-il être?

Mettre à jour

l'exception interne la 3ème erreur est la suivante:  La fonction s'est terminée avec succès, mais doit être appelée à nouveau pour compléter le contexte

selon iisper.h documentation , cette erreur appartient au

//
// MessageId: SEC_I_CONTINUE_NEEDED
//
// MessageText:
//
//  The function completed successfully, but must be called
//  again to complete the context
//
#define SEC_I_CONTINUE_NEEDED            ((HRESULT)0x00090312L)

on MSDN , il s'agit de

SEC_I_CONTINUE_NEEDED  Le client doit envoyer le jeton de sortie au serveur et attendre un jeton de retour. Le jeton renvoyé est ensuite passé dans un autre appel à InitializeSecurityContext (Schannel). Le jeton de sortie peut être vide.

Cela signifie-t-il qu'il manque un certificat client au PC?

Était-ce utile?

La solution

Un certain nombre de choses pourraient compliquer les choses, par exemple en ce qui concerne les incohérences avec les certificats SSL, etc. Cependant, vous devriez commencer par un débogage de base pour éliminer les choses évidentes:

- Avez-vous essayé d'envoyer une simple requête Web à d'autres serveurs? Essayez à la fois http (non sécurisé) et https (sécurisé)

- Avez-vous essayé de vous connecter depuis un autre ordinateur ou depuis un autre réseau? Vous avez mentionné que le client est derrière un proxy. Commencez par essayer un ordinateur sans proxy pour éliminer ce problème.

- Créez-vous plusieurs WebRequests au cours de la session? Il existe une limite stricte au nombre de demandes ouvertes. Assurez-vous donc de les fermer après avoir reçu WebResponse. Peut-être faire un programme de test avec une seule demande.

Si cela ne résout pas le problème, c'est probablement quelque chose de plus compliqué, avec le serveur ou le proxy. Vous pouvez suivre les paquets réseau sortants avec un programme tel que netshark pour essayer de localiser les problèmes qui se bloquent.

Autres conseils

Vous pouvez effectuer un suivi du trafic HTTP à l'aide de Fiddler ou d'un outil de détection de paquets sur le réseau, comme Ethereal Whireshark sur la machine sur laquelle il fonctionne et sur l'un des autres machines et comparer les résultats. Ceci est assez bas, mais pourrait jeter un peu de lumière sur la question.

  • Si vous pouvez utiliser Telnet depuis différentes machines vers 443, il ne s'agit pas des deux premières, car cela signifie que la machine cliente reçoit les demandes sur ce port.

Sur les fenêtres qui seraient

telnet <domainname> 443

et s'il se connecte, l'écran deviendra blanc (appuyez plusieurs fois sur la touche retour pour quitter)

  • Les mandataires peuvent ou non se soucier de votre demande si elle est sous HTTPS car ils ne peuvent pas la lire.

  • Le certificat client et la chaîne de certificats sont-ils installés sur les autres ordinateurs?

Le nom du certificat SSL ne correspond probablement pas. C’est souvent le cas des certificats autosignés.

La solution consiste à écrire votre propre routine d'authentification dans laquelle vous devez toujours retourner la valeur true ou effectuer l'authentification nécessaire pour vous assurer que le certificat est valide.

// .NET 2.0+
...
ServicePointManager.ServerCertificateValidationCallback += MyValidationCallback
...
public bool MyValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors err)
{
  return true;
}

// .NET 1.1
public class MyCertificatePolicy : ICertificatePolicy
{
  public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
  {
    return true;
  }
}
...
ServicePointManager.CertificatePolicy = new MyCertificatePolicy();
...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top