Laden...

Verbindung zu https Seite geht im Code nicht, im Browser schon

Erstellt von Seikilos vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.641 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren
Verbindung zu https Seite geht im Code nicht, im Browser schon

Hallo,
ich habe ein merkwürdiges Problem. Es gibt eine https Seite (URL kann ich nicht nennen) von der ich Daten beziehen soll (C#, 3.5)

Das Problem ist, wenn ich diese URL im Browser über https öffne, bekomme ich eine Antwort. Wenn ich die gleiche URL versuche über ein HttpWebRequest im Code anzufragen, bekomme ich immer ein Timeout.
Das ist ziemlich schwammig ich weiß, aber mir fehlen aktuell Ideen.

Ich hab für problematische Zertifikate ein


 System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
            {
                // Allow to pass
                return true;
            };

Callback installiert, aber so weit kommt die Anfrage nicht.

Der Code nur für die Anfrage (nicht die Response ist hier:)


HttpWebRequest request = null;
                if (m_type == PostTypeEnum.Post)
                {
                    Uri uri = new Uri(url);
                    request = (HttpWebRequest)WebRequest.Create(uri);
                    request.Method = "POST";
                    request.ContentType = "application/x-www-form-urlencoded";
                    request.ContentLength = postData.Length;
                    using (Stream writeStream = request.GetRequestStream()) //<---------- hier hängts
                    {
                        UTF8Encoding encoding = new UTF8Encoding(true);
                        byte[] bytes = encoding.GetBytes(postData);
                        writeStream.Write(bytes, 0, bytes.Length);
                    }
                }
                else
                {
                    Uri uri = new Uri(url + "?" + postData);
                    request = (HttpWebRequest)WebRequest.Create(uri);
                    request.Method = "GET";
                }

Das Programm kommt über GetRequestStream nicht hinaus.

Ich habe keine Probleme andere http UND auch https Seiten mit dem Tool zu rufen, bekomme dort auch ein Response, es kann also kein generelles SSL Problem sein.

Für Ideen wäre ich dankbar

Life is a short

175 Beiträge seit 2010
vor 12 Jahren

Nutzt Dein Browser ggf. 'nen Proxy und Teil Programm eben nicht?

Bye,
Knick

Debuggers don't remove Bugs, they only show them in Slow-Motion.

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren

Hallo,

nein, keine Proxy eingetragen.
Das müsste auch ein sehr spezieller Proxy sein, da er ja andere Seiten über https nicht blockiert.

Das komische ist, wenn ich manuell die Seite pinge und dann die aufgelöste IP nehme, so komme ich da durch, werde nur mit einem ungültigen Zertifikat konfrontiert, weil dieses nicht auf die IP ausgestellt ist.

Life is a short

W
872 Beiträge seit 2005
vor 12 Jahren

Schau Dir mal den Fiddleran...das ist eine gute Moeglichkeit, damit Du https Probleme analysieren kannst.
Eventuell musst Du sonst mit anderen Tools arbeiten, um die Header anzuschauen...

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

Du setzt die ContentLength bereits, bevor Du weisst, wie lang Deine Daten eigentlich sind.
Denn das von encoding.GetBytes(postData) gelieferte Bytearray hat eine andere Länge als der String. Setze also die ContentLength erst nach dem Umwandeln des Strings auf die Länge des resultierenden Bytearrays.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren

Schau Dir mal den
>
an...das ist eine gute Moeglichkeit, damit Du https Probleme analysieren kannst.
Eventuell musst Du sonst mit anderen Tools arbeiten, um die Header anzuschauen...

Habe ich schon, da es https ist, macht es einige Probleme, dies zutun. Ich habe den SSL Tunnel bei Fiddler aktiviert und eine Zertifikat zum Abfangen der Kommunikation erzeugt. Es kommt jedoch einfach nichts vom Server zurück. Wenn ich lange genug warte, dann gibt es einen Timeout. Ich weiß nicht, ob ich dem Server noch etwas senden muss.
Das komische ist, im Firefox kann ich auf die Seite zugreifen. Im Fiddler gibt es jedoch nichts spannendes zu sehen. Replizieren kann ich die SSL Kommunikation manuell jedoch ziemlich schlecht

@MarsStein. Das stimmt. Ich teste aktuelle mit dem GET code Pfad ohne Post Daten und ich bekomme keine Antwort vom Server.
Ich hab schon als User Agent den String vom Firefox genommen, um auszuklammern, dass der Server dort penibel ist. Nix gebracht.

Ich habe auch mal das Codesnippet von hier genommen:
C#: How to accept an invalid SSL certificate programmatically
Alle Server gehen, bis auf den einen

Life is a short

G
538 Beiträge seit 2008
vor 12 Jahren

Wenn du im Fiddler die beiden Anfragen hast - kannst du sie direkt miteinander vergleichen - dann solltest du sofort sehen, wo der Unterschied liegt.
Achte auch auf Header-Daten. Und prüfe die URL lieber nochmal ganz sorgfältig.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren

Werd ich nochmal heute Nachmittag angucken.

Dieser Server hat seine URL umgestellt. Es gibt eine alte https URL und eine neue. Auf die neue komme ich nicht mehr drauf, auf die alte schon.
Die OpenSSL Version hat sich zwischen den beiden URLs geändert. Ich überlege gerade, ob vielleicht C# und .net 3.5 vielleicht mit SSL V3 oder mit irgendetwas anderem Probleme hat.

Das irritierende ist: Beide Seiten haben das gleiche Zertifikat und doch geht die eine Seite und die andere nicht.

Life is a short

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren

Ok, machen wir es noch wesentlich komplizierter:

Wenn ich über den Domain namen gehe, so habe ich das Timeout. Wenn ich jedoch über die IP gehe, so funktioniert es.
Ich kapiere nicht, ob es DNS Problem sein soll, oder nicht. Wenn ich nämlich C# benutze, um die IP von der Domain zu bekommen:

 IPHostEntry he = Dns.GetHostEntry("domain.de");
url = @"https://"+he.AddressList[0];

So kann ich über die IP auf den Server. Kriege dann natürlich unsicheres Zertifikat usw, weil die IP mit dem Domainnamen nicht übereinstimmt.
Also DNS kann scheinbar korrekt aufgelöst werden, aber ohne die Umweg über die IP dann doch nicht?

Life is a short

G
538 Beiträge seit 2008
vor 12 Jahren

Das ist in der Tat alles etwas merkwürdig, aber sicher gibt es eine ganz einfache Lösung dafür.

Versuche dir für Debuggingzwecke ein Miniprojekt zu erstellen, das nichts anderes tut, als den Server anzufragen und auf die Antwort zu warten.
Nimm Fiddler (oder falls du gut damit umgehen kannst) NetMon und analysiere die Anfragen (sie sollten weitgehend identisch sein). Im Zweifelsfall bilde die Anfrage exakt in C# nach (nur um sicher zu gehen).

Außerdem versuche mal IPv6 abzuschalten - eventuell macht das ärger (zumindest hab ich das schon mal gesehen).

Du kannst auch die Anfragen aus .NET und deinem Browser direkt mit Fiddler wiederholen - musst also nicht zwingen diese Programme nutzen.

Wenn das eine Möglichkeit für dich ist: Versuche .NET 4

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren

Also das mit der Domain ist weiterhin ungeklärt, ich bin aber weiter, wenn ich mit der IP auf den Server zugreifen.

Ich generiere eine XML aus C#, welche im Header das Encoding Tag für utf 16 hat

<?xml version=""1.0"" encoding=""UTF-16""?>

konvertiere es später in UTF8, wenn ich es mit POST an den Server sende. Bei dem alten Server funktioniert das, bei dem neuen Server nicht.
Dort kann ich, egal welches Encoding ich im XML Tag einstelle nichts machen. Erst wenn ich das ganze XML Tag entferne, scheint es zu funktionieren.
Klingt das nach einem Client oder nach einem Server Problem?

Life is a short