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 ---
Welche Version von Mono verwenden Sie? – knocte