Frage

Hallo ich bin die Begegnung Probleme versuchen, eine WebRequest unter Https zu posten.

i erhielt die folgenden Fehler

1.-Die zugrunde liegende Verbindung wurde geschlossen:. Kann keine Verbindung zum Remote-Server verbinden

2.-die Operation TimeOut

3-Die zugrunde liegende Verbindung wurde geschlossen:. Kann nicht sicheren Kanal für SSL / TLS herstellen

Ich habe versucht, mit etwa 3 oder 4 verschiedenen Proxies meiner Firma und dem Kunden Unternehmen und auch nicht, wenn ich ohne Einschränkungen mit den ISP-Provider direkt am, erhalte ich die obigen Fehler, wenn die folgende Methode Ausführen

WebRequest.GetRequestStream() 

In diesem Fall hinter einem Proxy oder nicht, kann der Antrag nur post erfolgreich von einem einzigen PC, die hinter einem Proxy befindet. der Proxy kein Client-Zertifikat installiert sein.

Dies ist unter .NET Framework 1.1 und die Anforderung enthält bereits Netzwerkanmeldeinformationen.

Was gibt es?

Update

die innere Ausnahme der dritte Fehler ist die folgende:  Die Funktion erfolgreich abgeschlossen, muss aber wieder aufgerufen werden, um den Kontext zu vervollständigen

nach iisper.h Dokumentation diesen Fehler gehören auf die

//
// 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)

MSDN dies bezieht sich

SEC_I_CONTINUE_NEEDED  Der Kunde muss die Ausgabe-Token an den Server senden und für eine Rückkehr Token warten. Der zurückgegebene Token wird dann in einem weiteren Aufruf an InitializeSecurityContext (Schannel) geleitet. Der Ausgang Token kann leer sein.

tut dies bedeutet, dass der PC ein Client-Zertifikat fehlt?

War es hilfreich?

Lösung

Es gibt eine ganze Reihe von Dingen, die Dinge zu verkomplizieren könnte, soweit Unstimmigkeiten mit den SSL-Zertifikate, etc. Aber zuerst sollten Sie einige grundlegende Debugging tun, um die offensichtlichen Dinge ausschließen:

- Haben Sie eine einfache Web-Anfrage an andere Server zu senden? Versuchen Sie beide (ungesichert) http und (gesichert) https

- Haben Sie von einem anderen Computer anschließen, oder aus einem anderen Netz? Sie haben erwähnt, dass der Client hinter einem Proxy ist; versuchen, einen Computer w / o ein Proxy zuerst, dass auszuschließen.

- Machen Sie mehrere WebRequests in der Sitzung? Es ist eine harte Begrenzung der Anzahl der offenen Anfragen, so stellen Sie sicher, dass Sie sich zu schließen, nachdem Sie den WebResponse bekommen. Vielleicht ein Testprogramm mit nur einer Anfrage machen.

Wenn das es nicht einzuengen, dann ist es wahrscheinlich etwas komplizierter, mit ihrem dem Server oder dem Proxy. Sie können mit einem Programm wie netshark abgehende Netzwerkpakete verfolgen, um zu versuchen, ausfindig zu machen, wo die Dinge stecken zu bleiben.

Andere Tipps

Sie können eine Spur des HTTP-Datenverkehr machen mit Fiddler oder ein Netzwerk Packet Sniffing-Tool wie Ethereal Whireshark auf der Maschine, wo sie arbeitet, und auf einen der anderen Maschinen und die Ergebnisse vergleichen. Das ist ziemlich niedrigem Niveau, aber vielleicht etwas Licht auf die Frage werfen.

  • Wenn Sie von verschiedenen Maschinen bis 443 Telnet können dann ist es nicht die ersten beide, so dass bedeutet, dass der Client-Rechner Anfragen an diesem Port empfängt.

Ein Fenster, das wäre

telnet <domainname> 443

, und wenn es eine Verbindung der Bildschirm leer gehen (Hit ein paar Mal zurückkehren verlassen)

  • Die Proxies können oder tatsächlich über Ihre Anfrage kann es egal, ob es unter HTTPS ist, wie sie es nicht lesen kann.

  • Haben die anderen Maschinen installiert haben, das Client-Zertifikat und die Zertifikatskette?

Der SSL-Zertifikat Name wahrscheinlich nicht übereinstimmt. Dies ist häufig der Fall mit selbstsignierten Zertifikaten.

Die Lösung ist Ihre eigene Authentifizierungsroutine zu schreiben, wo man entweder immer true zurück, oder die notwendige Authentifizierung tun, um sicherzustellen das Zertifikat gültig ist.

// .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();
...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top