Guten Tag zusammen,
ich habe mal eine Frage bezüglich der Konfiguration einer Api (ASP.NET Core 2.1.0) in einem Windows-Container auf einem Windows-Host.
Der Container bzw. die Api laufen problemlos, allerdings soll die Api auch auf Netzwerkordner zugreifen können, welche von einer Domäne verwaltet werden und soll auf den Intranet-DNS-Server zugreifen können. Und das ist mein Problem. Einerseits habe ich noch keinen Weg gefunden wie ich den Container/die Api motivieren kann sich in der Domäne anzumelden (so wie ich z.B. bei einem IIS für eine App festlegen kann mit welcher Windows-Anmeldung diese läuft).
Des weiteren soll die Api andere Services ansprechen können. Hier ist das Problem, dass die HTTPS-Verbindungen mit Zertifikaten einer CA aus dem Intranet laufen und ich habe noch keinen Weg gefunden, dass der Container der CA traut.
Habt ihr hier evtl Ansätze?
Beste Grüße
emuuu
2+2=5( (für extrem große Werte von 2)
Wenn Du auf ein Windows-geschütztes Dateisystem zugreifen willst, dann brauchst Du Impersonation.
Docker bzw. der Host kann Dir das nicht abnehmen. Im IIS ist das ein spezielles Feature, das Du so in ASP.NET selbst nicht hast.
Daher solltest Du problemlos auf die HTTPS Schnittstelle mit nicht-vertrauenswürdigem Zertifikat zugreifen können.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
- Docker interessiert eigentlich Dein CA nicht.
Docker deckt nur die TCP Ebene ab, nicht HTTPS.
Habe das Problem eher fälschlicherweise Docker zugeordnet. Konkret habe ich zwei Probleme:
Konkret müsste ich also zwei Dinge erreichen:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.Listen(IPAddress.Loopback, 5000, listenOptions =>
{
var configuration = (IConfiguration)options.ApplicationServices.GetService(typeof(IConfiguration));
listenOptions.UseHttps(@"C:\https\wildcard.pfx", "12345");
});
})
.UseStartup<Startup>();
(hardcoded Passwort bitte ich zu übersehen, in der finalen Variante isses durch eine enviroment variable ersetzt)
Das funktioniert aktuell noch nicht, da ich beim Mounten des C:\https-Ordners Probleme habe und der Service wegen FileNotFound gar nicht erst startet.
2+2=5( (für extrem große Werte von 2)
- Wenn die Api sich an den IdentityServer wenden will (der aktuell noch in einem IIS lebt) kriege ich einen Verbindungsfehler aufgrund eines "Untrusted Certificates".
Was meinst Du mit "verwenden"? Die Authentication Middleware?
Kannst die HTTPS Pflicht deaktivieren
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Genau, wenn ich eine Anfrage an die Api sende stößt dies auf die AuthenticationMiddleware von wo aus der IdentityServer abgerufen wird. Konkret schmeißt die Api bei GET '~/.well-known/openid-configuration' einen Fehler, dass die Abfrage nicht ausgeführt werden konnte, da das Zertifikat untrusted ist. Eben dieses Zertifikat, dass der IIS verwendet um den IdentityServer zu hosten wurde von einer lokalen CA signiert, welche der Api in ihrem Docker-Container nicht bekannt zu sein scheint.
2+2=5( (für extrem große Werte von 2)
Du hast also ein Self Signed Certificate für Deinen Identity Host, der in einem IIS läuft.
Das hat meines Wissens nichts mit Docker und nichts mit ASP.NET per se zutun, sondern mit der Authentication Pipeline.
Bin mir nicht sicher, ob Du aus Docker auf den Windows Cert Store zugreifen kannst; muss ja irgendwie. Sonst wären alle HTTPS Zugriffe aus Docker nicht möglich.
Evtl über ne Volume..?!
Du kannst aber manuell in die Zertifikatsvalidierung von ASP.NET Core eingreifen, um zB via Certificate Pinning die Gültigkeit selbst zu bestätigen.
Dafür brauchst einen IAuthorizationFilter, der auf OnAuthorization hört und das Zertifikat manuell validiert.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Das hier scheint eine Lösung zu sein:
Import and bind an SSL cert in a Windows container using Powershell
Werd es morgen mal austesten.
2+2=5( (für extrem große Werte von 2)