2016-05-04 97 views
0

Scope:Mono HTTPS-Fehler - „Fehler Schreiben Headers“

Ich versuche, mit einem externen zentralen Logging service Anbietern zu integrieren, indem HTTPS Anfragen, die Protokolle, um es zu veröffentlichen.

Wir laufen C# auf Mono, mit Ubuntu 14.04 LTS als Betriebssystem.

Wir verwenden mono schon seit Jahren, so dass wir irgendwie mit seinen Verhaltensweisen und potenziellen Fehlern vertraut sind.

vorherige Setup-

Wenn dieses Problem googeln, finden Sie im Grunde zwei Lösungen, um es, und keiner von ihnen zu mir gearbeitet, für diesen Fall. Hier ist, was ich bisher getan habe

Basic Mono-Complete Setup + ca-Zertifikate-Mono (das würde möglicherweise HTTPS Probleme zu lösen).

Ansonsten weiß ich, dass mono standardmäßig kein Zertifikat traut, dass es eine eigene Zertifikatskette hat, und dass wir sie importieren müssen. Um das zu tun, lief ich mozroots --import --sync --ask-remove und es druckte mir, dass "140 Zertifikate heruntergeladen und installiert wurden".

Aditionally, overrode wir die CertificateValidationCallback mit diesen fiesen Einzeiler:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => { return true; }; 

Keines der oben genannten unser Problem gelöst.

Fehler, Irrtümer und Fehler:

Note that all of the codes below do work on Windows.

So haben wir weit versucht:

  • Verwendung des einheitlichen .NET WebClient Async Calls (PostAsync).

Als Ergebnis erhalten wir Fehler wie Cant find file system.net.http.dll, und wenn wir das eine von unserem Windows-System, um es tatsächlich zu kopieren, erhalten wir einen weiteren Fehler Task Exception (es die genaue Meldung nicht mehr erinnern kann).

Anscheinend verwenden, mit diesem Client auf Xamarin Programme neigen dazu, die Probleme Menschen haben zu lösen, aber wir bekommen immer noch die gleichen Fehler, die oben aufgeführt sind, von den Standard HttpClient-Klasse .NET

  • Schreiben eigener WebRequests Wrapper

Dies war das Ergebnis, das einer tatsächlichen Lösung am nächsten kam, was bei Mono zu Error Writing Headers führt.

Kleine Code-Beispiel:

using (WebRequests webClient = new WebRequests()) 
{ 
       // Client Configuration 
       webClient.BufferSize  = 32 * 1024; 
       webClient.Accept   = "application/json"; 
       webClient.ContentType  = "application/json; charset=" + Encoding.UTF8.HeaderName; 
       webClient.Timeout   = 60000; 
       webClient.ReadWriteTimeout = 60000; 
       webClient.Encoding   = Encoding.UTF8.WebName; 

       // Dummy Logz Payload - One Json Per Line 
       string LogzPayload = "{id:'1', value='1'}\n{id:'2', value='2'}"; 

       // Request to Logz 
       webClient.Post ("https://listener-4.logz.io:8071/?token=OUR_TOKEN&type=json", LogzPayload); 
} 

Update 1:

Gerade versucht den folgenden Befehl ausführen und eine Ausnahme sofort bekam:

certmgr --ssl https://listener-4.logz.io:8071/?token=OUR_TOKEN&type=json --machine 

Ausnahme:

Unhandled Exception: 
System.IO.IOException: The authentication or decryption has failed. --->  System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: The authentication or decryption has failed. 
    at Mono.Security.Protocol.Tls.RecordProtocol.EndReceiveRecord (IAsyncResult asyncResult) <0x4192e470 + 0x00132> in <filename unknown>:0 
    at Mono.Security.Protocol.Tls.SslClientStream.SafeEndReceiveRecord (IAsyncResult ar, Boolean ignoreEmpty) <0x4192e3a0 + 0x00031> in <filename unknown>:0 
    at Mono.Security.Protocol.Tls.SslClientStream.NegotiateAsyncWorker (IAsyncResult result) <0x4192abb0 + 0x00225> in <filename unknown>:0 
    --- End of inner exception stack trace --- 
+0

Welche Version von Mono verwenden Sie? – knocte

Antwort

1

Ich bin nicht vertraut mit Mono, aber ich weiß, dass sie ihren eigenen TLS-Stack verwenden, während .NET den TLS-Stack aus dem Betriebssystem verwendet. Wenn ich richtig bin, sind die verfügbaren Cipher Suites in CipherSuiteFactory.cs definiert, was zeigt, dass keine ECDHE- und keine DHE-Chiffren verfügbar sind. Aber von dem, was ich sehen kann, unterstützt der Server nur ECDHE- und DHE-Chiffren und somit wird es keine geteilten Chiffren geben und der TLS-Handshake wird fehlschlagen. Die Chiffren vom Server unterstützt werden, sind:

ECDHE-RSA-AES256-GCM-SHA384 
ECDHE-RSA-AES128-GCM-SHA256 
DHE-RSA-AES256-GCM-SHA384 
DHE-RSA-AES128-GCM-SHA256 
ECDHE-RSA-AES256-SHA384 
ECDHE-RSA-AES256-SHA 
DHE-RSA-AES256-SHA256 
DHE-RSA-AES256-SHA 

Die meisten davon sind Chiffren müssen TLS 1.2, die von Mono wird nicht unterstützt (siehe State of TLS in Mono). Aber auch der Rest ist DHE oder ECDHE nur was Mono scheint nicht zu unterstützen. Sie arbeiten aktiv an einem new TLS stack, aber es sieht so aus, als ob es noch nicht fertig ist.

Wenn Sie Zugriff auf den Server haben, können Sie versuchen, die Chiffre AES256-SHA zu konfigurieren, die wahrscheinlich die beste Verschlüsselung ist, die derzeit von Mono unterstützt wird.

+0

WoW. Das ist eine höllische Antwort! :) Also, was Sie sagen, ist, dass, wenn entweder Mono seinen neuen TLS-Stack veröffentlicht, oder Logz fügt Unterstützung für andere Chipher, es gibt keine Möglichkeit, dass es funktioniert, richtig? Wie haben Sie die unterstützten Verschlüsselungen des Servers überprüft? –

+0

@MarcelloGrechiLins: Ja, das sage ich. Ich habe die Chiffren mit [meinem eigenen Perl-Tool] (https://github.com/noxxi/p5-ssl-tools/blob/master/analyze-ssl.pl) überprüft, aber Sie könnten wahrscheinlich auch [das Python-Tool verwenden sslyze] (https://github.com/nabla-c0d3/sslyze) statt. –

+0

Haben Sie logz.io oder die API getestet? –

0

Ich empfehle Ihnen, zu Ubuntu 16.04 zu wechseln, da dies eine Version von Monos Paketen bringt, die Zertifikate standardmäßig synchronisiert und Sie daher keine Mozroots ausführen müssen, und Sie wahrscheinlich keine Probleme in diesem Bereich haben werden.

+0

Ubuntu ist nicht das Problem. @SteffenUllrich wies darauf hin, dass Mono einen eigenen TLS-Stack hat, der fehlerhaft ist und Implementierungen einiger Cypher verpasst, was zu nicht funktionierenden HTTPS-Handshakes führt. –