2017-04-07 17 views
7

में प्रमाण स्टोर से हस्ताक्षर प्रमाण पत्र कैसे लोड करें हमारे पास एक पहचान सर्वर 4-आधारित एसटीएस सफलतापूर्वक विंडोज पर चल रहा है, जहां स्थानीय कंप्यूटर पर हस्ताक्षर प्रमाण पत्र को व्यक्तिगत> प्रमाणपत्र, और .cer के अंतर्गत .pfx के साथ स्थापित किया गया है। भरोसेमंद लोगों के तहत> प्रमाण पत्र। इस प्रकार हम तो अपने सामान्य नाम से हस्ताक्षर क्रेडेंशियल लोड करने में सक्षम हैं:पहचान सर्वर 4: डॉकर

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

अब हम एक डोकर कंटेनर के भीतर हमारे एसटीएस कार्यान्वयन को चलाने के लिए चाहते हैं, और निम्न अपवाद में चल गया है:

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) 

उपर्युक्त त्रुटि संदेश के आधार पर, और AddSigningCredential विधि का स्रोत हम यहां उपयोग कर रहे हैं: https://github.com/IdentityServer/IdentityServer4/blob/ec17672d27f9bed42f9110d73755170ee9265116/src/IdentityServer4/Configuration/DependencyInjection/BuilderExtensions/Crypto.cs#L73, ऐसा लगता है कि हमारी समस्या यह है कि पहचान सर्वर 4 स्थानीय मशीन के व्यक्तिगत ("मेरा") स्टोर में प्रमाणपत्र की तलाश में है हालांकि, त्रुटि संदेश के अनुसार यूनिक्स वातावरण के भीतर ऐसी दुकान उपलब्ध नहीं है।

तो, मुझे यह जानकर उत्सुकता है कि डॉकर कंटेनर में पहचान सर्वर 4 के लिए हस्ताक्षर प्रमाण पत्र लोड करने के लिए कुछ सर्वोत्तम अभ्यास मौजूद है, अगर इसे नाम या फिंगरप्रिंट द्वारा लोड करना संभव नहीं है। क्या हमारे आवेदन के साथ प्रमाण पत्र को बंडल करना एकमात्र विकल्प होगा, फिर इसे फ़ाइल नाम से लोड करें?

किसी भी मदद के लिए धन्यवाद जो आप पेश करने में सक्षम हो सकते हैं!

+1

हाय शॉन आप इस समस्या का समाधान है? – xszaboj

+0

@xszaboj ऐसा लगता है कि यह .NET कोर 2 (कम से कम CurrentUser \ My) के लिए लागू किया गया है, https://github.com/aspnet/DataProtection/issues/125 देखें। यह LocalMachine \ My का मामला नहीं है – Bidou

उत्तर

0

मैं खिड़कियों मशीन पर विकासशील रहा हूँ और मैं दुकान से प्रमाण पत्र प्राप्त करने के लिए कोड निम्न का उपयोग

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(); 
    } 
संबंधित मुद्दे