2011-01-12 12 views
4

ich versuche inialise einen tls Tunnel mit dem .net SslStream aber nach dem Stream zu öffnen erhalte ich immer folgende Fehlermeldung:.NET SslStream funktioniert nicht

„Daten kann nicht von der Transportverbindung lesen: Eine bestehende Verbindung wurde von der Software in Ihrem Host-Rechner abgebrochen. "

Nachdem ich eine Tls-Verbindung hergestellt und nach dem Senden einer zweiten Nachricht.

Ich habe nach einer Antwort für die letzten vier Tage gesucht, aber es gibt keine hilfreichen Informationen online!

edit: Ich versuche

talk.google.com zu verbinden, und ich bin das Codebeispiel aus MSDN verwenden. Der einzige Unterschied ist, dass ich Daten bin das Senden vor und wenn es Zeit ist, die Verwendung von TLS i wie folgt vor:

public void SecureStream() 
     { 
     netStream.Flush(); 
     sslStream = new SslStream(netStream, false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 

    sslStream.AuthenticateAsClient("talk.google.com");} 

edit: ich den ersten Fehler (kleinen Fehler auf, wie ich die Sende wurde Handling) zu beseitigen verwaltet jetzt bekomme ich immer

"Daten können nicht von der Transportverbindung gelesen werden: Eine bestehende Verbindung wurde von der Software in Ihrem Host-Rechner abgebrochen."

edit2: Ich habe keine whitespaces gesendet. Ich habe den Nachrichtenübergabeteil neu geschrieben und ich habe immer noch das selbe Problem.

Ich beginne mit

String streamInit = "<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' to='google.com' version='1.0'>"; 
     client.Send(streamInit); 

Dann auf erhalte ich habe folgendes

static void client_MessageReceived(SyncronousClient source, string Result) 
    { 


     if (Regex.IsMatch(Result, "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"><required/></starttls>")) 
     { 
      String startTlS = "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"; 
      source.Send(startTlS); 

     } 
     else if (Regex.IsMatch(Result, "<proceed xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>")) 
     { 
      //Do TLS Magic 
      source.SecureStream(); 
      String streamReInit = "<stream:stream xmlns='jabber:client'xmlns:stream='http://etherx.jabber.org/streams'to='google.com'version='1.0'>"; 
      source.Send(streamReInit); 
     } 
     else if (Regex.IsMatch(Result, "<mechanisms xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">")) 
     { 
      //String AuthType = "<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='X-GOOGLE-TOKEN'/>"; 
      String AuthType = "<auth xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\" mechanism=\"PLAIN\"/>"; 
      source.Send(AuthType); 
     }} 
+2

Das Problem könnte alles sein.Sie müssen viel spezifischer sein und Code und Informationen zu dem Server bereitstellen, mit dem Sie kommunizieren möchten. – Jonathan

+1

Wenn Sie sagen, dass "... nicht funktioniert", ist es 90% Wahrscheinlichkeit, dass Sie schuld sind. –

+0

ich sage nicht, es ist nicht meine Schuld, aber ich bin stecken und ich kann keinen Weg finden, wie es zu beheben .. – Marcom

Antwort

0

That really doesn't make sense to me. The server, if using SSL, requires that the client perform the SSL handshake upon connection. Thus, I'm not sure what you mean by "I'm sending data before...". It sounds like your not immediately calling the AuthenticateAsClient. If this is the case, I suspect that is your problem. AFAIK, you cannot use the same socket/connection connection for both SSL and non-SSL communications. Either the server requires SSL, or it does not support it, it should never do both.

meine Antwort oben in Unkenntnis war. Tatsächlich scheint es, dass der Standard tatsächlich verlangt, dass die Verbindung Daten vor der Initialisierung des SSL-Handshakes sendet und empfängt. Wirklich seltsam, dass sie das tun würden ... aber was auch immer. Nach kurzem Lesen von parts of the RFC scheint es, dass Sie die SSL-Client-Authentifizierung unmittelbar nach dem Schließen von '>' beginnen sollen. Kein schließendes Leerzeichen erlaubt, was Ihr Problem sein könnte?

+0

ich versuche, eine Verbindung zu einem XMpp-Server. Zuerst müssen Sie einige XML-Nachrichten senden und dann müssen Sie eine Tls-Verbindung aushandeln. Ich habe versucht, den leeren inneren Stream auf "false" zu setzen, was automatisch eine neue Verbindung erzeugt, aber ich habe das gleiche Problem. – Marcom

+0

Ich habe keinen zusätzlichen Leerraum. Die Ausnahme tritt immer auf, nachdem TLS eingerichtet wurde und die zweite Nachricht gesendet wurde, während ich auf die SASL-Abfrage – Marcom

1

Es ist unwahrscheinlich, dass es Ihr Problem ist (es sei denn, .Net hat begonnen, SNI unter den Abdeckungen zu tun), aber wenn Sie AuthenticateAsClient aufrufen, geben Sie den gleichen Domainnamen ein, den Sie in Ihrem Stream verwendet haben (in diesem Fall google.com) . Wie gut, könnte man gmail.com statt google.com benötigen:

sslStream.AuthenticateAsClient("gmail.com", null, SslProtocols.Tls, false); 

als csharptest.net zu anspielte, stellen Sie sicher, dass Sie nicht über einen Keep-Alive-Timer haben, die zusätzliche Leerzeichen sendet, oder den Timer bis nach TLS Werke warten zu starten . Der einzige andere Weg, den ich mir vorstellen kann, diesen Fehler zu bekommen, ist, wenn Sie keine Verschlüsselungssuite haben, die der Server implementiert, aber ich weiß, dass .Net SslStream gegen GTalk arbeitet.

Schließlich verwenden Sie eine der vorhandenen .NET-Bibliotheken für XMPP (es gibt aufgeführt here), und Sie können beginnen viel mehr Spaß Code sofort zu schreiben. Sie sind dabei, auf die Unzulänglichkeiten des .Net-XML-Systems zu stoßen, und Ihre Regex-basierte Methode wird nicht funktionieren, wenn Sie Teilstrophen oder mehrere Zeilengruppen in einem einzigen Lesevorgang erhalten.

+0

wartete. Ich habe die anderen Bibliotheken verwendet, um einen einfachen Client von Grund auf neu zu erstellen, um eine bessere Protokollierung zu erreichen. Ich verbinde mich mit talk.google.com. Wenn ich die Authentifizierungsdomäne auf gmail.com ändere, erhalte ich einen Fehler bei der Zertifizierung. Ich habe kein Zeitlimit eingestellt, aber selbst wenn ich es auf eine kurze oder lange Zeit ändere, bekomme ich keine Antwort auf die Herausforderung:/ – Marcom

+0

talk.google.com sollte funktionieren, aber ihr SRV-Eintrag verweist auf 'talk.l. google.com'. Der Name des tatsächlichen Hosts, zu dem Sie eine Verbindung herstellen, ist * nicht * der Name, der auf dem Zertifikat zu erwarten ist, sondern der logische Name des Dienstes in der Stream-to-Adresse, der mit dem Domainnamen in Ihrem übereinstimmen muss Benutzer JID (gmail.com). Googles Server sollte Ihnen ein gmail.com-Zertifikat anbieten, wenn Sie Ihr stream 'to'-Attribut auf gmail.com setzen. –

Verwandte Themen