2016-11-17 4 views
0

Ich führe einen Zertifikatsspeicher von S3 für eine ASP.NET-Cloud-Anwendung. Die Klasse S3CertificateStore liest .pfx-Dateien und Kennwortdateien von S3 und erstellt die Zertifikate im Arbeitsspeicher..NET kryptografische Dateien aus AWS S3 lesen - einige Dateien fehlschlagen auf Prod, erfolgreich auf dev

private void LoadPrivateCerts(X509Certificate2Collection certificates) 
     { 
      var s3Files = S3Facade.ListObjects(Config.Bucket, Config.PrivatePath).ToList(); 

      foreach (var filePath in s3Files) 
      { 
       if (filePath.EndsWith(".pass") || filePath.EndsWith("/")) 
       { 
        continue; 
       } 
       try 
       { 
        var certBytes = S3Facade.GetObject(Config.Bucket, filePath); 
        var pwdBytes = S3Facade.GetObject(Config.Bucket, filePath + ".pass"); 
        var pwd = Encoding.UTF8.GetString(pwdBytes); 

        var cert = new X509Certificate2(certBytes, pwd, X509KeyStorageFlags.Exportable); // needs to be exportable! 
        certificates.Add(cert); 
       } 
       catch (Exception e) 
       { 
        exceptions.Add(e); 
       } 
      } 
     } 

Wenn ich lokal ausführen, werden alle Zertifikate aus S3 gezogen und korrekt rekonstituiert. ABER ... wenn ich den Code auf einer EC2-Instanz ausführe, sind einige Zertifikate in Ordnung und andere scheitern. (Die gleichen scheitern immer).

EXCEPTION: The system cannot find the file specified. 

    at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 
    at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) 
    at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags) 

Ich bin verwirrt. Könnte es bei der Arbeit eine Art Zeichencodierung geben? Ich glaube nicht, dass eines der Passwörter High-Bit-Zeichen hat, aber ich kann sie sehen, nachdem etwas schon passiert ist.

Irgendwelche Vorschläge?

+0

Alle Dateien befinden sich in demselben Bucket, und alle haben denselben Besitzer. Wenn ich zur Protokollierung hinzufüge, kann ich sehen, dass die .pfx und .pfx.pass-Dateien die gleiche Anzahl von Bytes haben, wenn der Code auf Prod ausgeführt wird, als wenn es lokal ausgeführt wird. –

+0

Haben Sie versucht, File.ReadAllBytes() zu verwenden, um es in ein Byte-Array zu laden und das Array an den X509Certificate2-Konstruktor zu übergeben? Es ist bekannt, dass die zugrunde liegende Kryptographiebibliothek zum Beispiel keine symbolischen Links mag, und daher haben diese Dateien möglicherweise ein Attribut, mit dem sie nicht zufrieden sind. – bartonjs

+0

Danke bartonjs. In dieser Einstellung sind die Dateien zu dem Zeitpunkt, an dem wir versuchen, die Zertifikate zu erstellen, tatsächlich Byte-Arrays. –

Antwort

0

Ich fand eine praktikable Lösung. Wenn ich die IIS-AppPool-Einstellung "Load User Profile" auf True setze, funktioniert die Zertifikatserstellung. Das folgende Skript in einer Datei .ebextension scheint den Trick zu tun:

c:\windows\system32\inetsrv\appcmd.exe set config /section:applicationPools "/[name='DefaultAppPool'].processModel.loadUserProfile:true" 

Ich verstehe immer noch nicht, warum Zertifikat Bau wurde konsequent für einige Zert Erfolg und konsequent für andere versagt, vor dieser Änderung.

+0

Hier ist eine andere Antwort, die erklärt, warum Load User Profile das Laden von Zertifikaten beeinflusst. http://stackoverflow.com/a/17149834/492405 – vcsjones

Verwandte Themen