2017-04-07 41 views
7

Mamy STS działający w oparciu o IdentityServer4, działający z powodzeniem w systemie Windows, w którym Poświadczenie podpisu zostało zainstalowane na komputerze lokalnym z .pfx w sekcji Osobiste> Certyfikaty i .cer w obszarze Zaufani ludzie> Certyfikaty. Jesteśmy wtedy w stanie załadować poświadczenia podpisanie przez swoją nazwą zwyczajową, co następuje:IdentityServer4: Jak załadować podpisywanie poświadczeń z magazynu certyfikatów, gdy jest w Docker

services.AddIdentityServer() 
    .AddSigningCredential("CN=CERT_NAME") 
    ... 

Jesteśmy teraz chce uruchomić naszą realizację STS w pojemniku Docker i zostały uruchomione w następującym wyjątkiem:

Unhandled Exception: System.PlatformNotSupportedException: Unix LocalMachine X509Store is limited to the Root and CertificateAuthority stores. 
    at Internal.Cryptography.Pal.StorePal.FromSystemStore(String storeName, StoreLocation storeLocation, OpenFlags openFlags) 
    at System.Security.Cryptography.X509Certificates.X509Store.Open(OpenFlags flags) 
    at IdentityModel.X509CertificatesFinder.Find(Object findValue, Boolean validOnly) 
    at Microsoft.Extensions.DependencyInjection.IdentityServerBuilderExtensionsCrypto.AddSigningCredential(IIdentityServerBuilder builder, String name, StoreLocation location, NameType nameType) 

W oparciu o powyższy komunikat o błędzie i źródło metody AddSigningCredential, której używamy tutaj: https://github.com/IdentityServer/IdentityServer4/blob/ec17672d27f9bed42f9110d73755170ee9265116/src/IdentityServer4/Configuration/DependencyInjection/BuilderExtensions/Crypto.cs#L73, wydaje się oczywiste, że naszym problemem jest to, że IdentityServer4 szuka certyfikatu w magazynie osobistym komputera lokalnego ("My") jednak taki magazyn nie jest dostępny w środowiskach Unix zgodnie z komunikatem o błędzie.

Ciekawe, czy istnieje jakaś dobra praktyka w celu załadowania Poświadczenia logowania dla IdentityServer4 w kontenerach Docker, jeśli nie można załadować go według nazwy lub odcisku palca. Czy jedyną opcją byłoby powiązanie certyfikatu z naszą aplikacją, a następnie załadowanie go według nazwy pliku?

Dzięki za pomoc, jaką możesz zaoferować!

+1

Cześć Sean pan rozwiązać ten problem? – xszaboj

+0

@xszaboj Wydaje się, że jest zaimplementowany w .NET Core 2 (przynajmniej dla CurrentUser \ My), zobacz https://github.com/aspnet/DataProtection/issues/125. Nie dotyczy to LocalMachine \ My – Bidou

Odpowiedz

0

Zajmuję się na komputerze z systemem Windows i używam następujący kod, aby uzyskać certyfikat z magazynu

X509Certificate2 cert = null; 

X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
      certStore.Open(OpenFlags.ReadOnly); 

X509Certificate2Collection certCollection = certStore.Certificates.Find(
         X509FindType.FindByThumbprint, 
         "‎thumbprint", 
         false); 
if (certCollection.Count > 0) 
    { 
     cert = certCollection[0]; 
     Log.Logger.Information($"Successfully loaded cert from registry: {cert.Thumbprint}"); 

    } 
    if (cert == null) // Fallback 
    { 
     cert = new X509Certificate2(Path.Combine(_env.ContentRootPath, "certificate.pfx"), "password"); 
     //Log.Logger.Information($"Falling back to cert from file. Successfully loaded: {cert.Thumbprint}"); 
    } 
    else 
    { 
     certStore.Dispose(); 
    }