2017-12-13 4 views
1

Ich habe einen internen REST-Dienst implementiert, der einen anderen (externen) REST-Dienst verwendet. Der externe Dienst ist mit HTTPS mit Client-Zertifikat (und Tokens) gesichert.Client-Zertifikat HttpClient .Net Core Docker Linux

In der ersten Implementierung war es ein Dienst auf Basis von .NET Framework (4.6.2 natürlich Fenster) und der Code sah wie folgt aus:

 var certificate = new X509Certificate2("./ExternalCert.pfx", "supersecurepassword764689"); 
     var httpClientHandler = new HttpClientHandler 
     { 
      ClientCertificateOptions = ClientCertificateOption.Manual, 
      ClientCertificates = 
      { 
       certificate 
      }, 
      CookieContainer = this.cookieContainer, 
     }; 
     this.httpClient = new HttpClient(httpClientHandler) 
     { 
      BaseAddress = new Uri(url) 
     }; 

Und es funktionierte ganz gut. Jetzt wechseln wir zu ASP.NET Core 2 (basierend auf .NET Core) und Docker. Während der Entwicklung auf meiner Windows-Maschine hat der obige Code auch mit .NET Core funktioniert.

Aber jetzt, wenn ich es innerhalb des Dockers Container (natürlich Linux) ausführen, funktioniert es nicht mehr (SSL Error). (Vorläufig wird das Zertifikat in das Container-Image kopiert, aber es ist geplant, es mit Docker-Secrets zu speichern).

Ich habe etwas recherchiert und es scheint, dass * .pfx nicht auf Linux funktioniert und Sie müssen eine * .pem-Datei basierend auf pfx erzeugen. So erzeugte ich es mit diesem Befehl:

var certificate = new X509Certificate2("./NewExternalCert.pem", "supersecurepassword764689"); 

und auch versucht:

var certificate = new X509Certificate2(File.ReadAllBytes("./NewExternalCert.pem"), "supersecurepassword764689"); 

Jetzt habe ich noch einen Fehler vom externen

openssl pkcs12 -in ExternalCertificate.pfx -out ExternalCertificate.pem -nodes 

Danach ich die folgende Zeile ersetzt Service, dass das Client-Zertifikat fehlt, aber es gibt keine Ausnahme in meiner Anwendung.

Also, was mache ich falsch? Wie kann ich das Zertifikat unter Linux senden? Gibt es eine Möglichkeit, es auf beiden OS auf die gleiche Weise zu tun?

Vielen Dank im Voraus für einen Rat!

+0

vorgesehen funktioniert Klingt wie dieser Teil viele Probleme hat, https://github.com/dotnet/corflex/search? q = client + certificate + httpclienthandler & type = Issues & utf8 = ✓ Sie könnten weiter graben, um zu sehen, was Sie getroffen haben und ob es bereits eine Lösung gibt. Öffnen Sie ein neues, wenn keines zu Ihrem gehört. –

+0

Ja, lese viele von ihnen und probierte einige "Lösungen". Ich habe viel Zeit damit verbracht, verschiedene Dinge auszuprobieren, und jetzt bin ich mir nicht sicher, ob ich etwas zu offensichtlich vermisse. – pr177

+0

Ein schneller Weg besteht darin, Microsoft-Unit-Testfälle für diesen Teil zu untersuchen und zu sehen, ob sie unter Linux funktionieren. Dann bekommen Sie eine Idee, ob Microsoft es bereits implementiert hat. –

Antwort

1

Ich habe es herausgefunden. Sie müssen die Linux-Umgebung einrichten, da Sie das Zertifikat unter Windows installieren müssen.

kopiert ich die Zertifikate als Teil des Behälters Bild (Dockerfile) mit:

COPY ExternalCert.pem /etc/ssl/certs/ExternalCert.pem 

Danach wird der Code wie

Verwandte Themen