Laden...

[Erledigt] X509Certificate2 aus Bytes: Exception in Azure WebApp

Erstellt von Papst vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.818 Views
P
Papst Themenstarter:in
441 Beiträge seit 2014
vor 6 Jahren
[Erledigt] X509Certificate2 aus Bytes: Exception in Azure WebApp

Hi,

ich versuche ein X509 Zertifikat aus einem Bytearray zu erstellen.
Ich benutze dies in einer .net core 2.0 (ASP MVC) app.
Das erstellen des Objektes funktioniert lokal in meinem VS mit den gleichen Zertifikatsbytes (abgefragt aus einem Azure Key Vault) wunderbar. Lade ich die App allerdings als WebApp hoch und führe es dort aus bekomme ich eine Exception, welche im Text auf FileNotFound verweist.

Unter der Exception habe ich bei Google leider nichts auf mein Problem zutreffendes gefunden, habe mir die genaue Exception dummerweise auch nicht notiert und kann sie erst morgen wieder reproduzieren. Aber vielleicht hat ja jemand bereits etwas ähnliches gemacht.

Edit: Das Zertifikat soll zum signieren bei einem IdentityServer eingesetzt werden, das sollte hierauf aber keinen Einfluss haben, da es ja schon im Konstruktur des Zertifikat Objektes knallt.

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Papst,

habe mir die genaue Exception dummerweise auch nicht notiert und kann sie erst morgen wieder reproduzieren

Bitte poste dann die genaue Exception (komplett), denn sonst ist Ursachenforschung schwer durchführbar. Wobei FileNotFound wohl auf einen falschen Pfad hinweist unter der Annahme dass die Zertifikats-Date vorhanden ist. Gib daher durch Logging auch den Pfad aus.

Ich hoffe du kopierst ab nun die Exceptions immer und verwirfst sie erst dann wenn du sicher bist, dass sie nicht mehr benötigt wird 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
Papst Themenstarter:in
441 Beiträge seit 2014
vor 6 Jahren

Moin,

ja normalerweise kümmere ich mich um jede Exception, bis ich verstanden habe weshalb sie kommt und wie ich sie beheben kann 😃
Dieses mal bin ich, um eine funktionierende Lösung zu haben, temporär auf

.AddDeveloperSigningCredentials()

umgestiegen, was das Problem umgeht.

Hier der passende Code Teil


string certString = Configuration.GetValue<string>("IdentityServerPfx");
// TODO: fix this, on AzureWebApp creating the cert from bytes fails with Exception
if (string.IsNullOrEmpty(certString))
{
	builder.AddDeveloperSigningCredential();
}
else
{
	byte[] certBytes = Convert.FromBase64String(certString);
	X509Certificate2 cert = new X509Certificate2(certBytes, string.Empty, X509KeyStorageFlags.MachineKeySet|X509KeyStorageFlags.Exportable|X509KeyStorageFlags.UserKeySet);
	builder.AddSigningCredential(cert);
}

und die Exception:> Fehlermeldung:

Unhandled Exception: Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: The system cannot find the file specified
at Internal.Cryptography.Pal.CertificatePal.FilterPFXStore(Byte[] rawData, SafePasswordHandle password, PfxCertStoreFlags pfxCertStoreFlags)
at Internal.Cryptography.Pal.CertificatePal.FromBlobOrFile(Byte[] rawData, String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)

Ich habe schon verschiedene Sachen geprüft, einfach um sicher zu gehen, dass die Services alle passen:*Die KeyVault Verbindung funktioniert (es werden andere secrets abgerufen) *Die Zertifikat Bytes stimmen mit denen überein, die lokal bei mir funktionieren *Das Zertifikat aus lokaler Dateiquelle eingelesen funktioniert auch nicht (Einlesen nach byte -> gleicher Konstruktor)

Zu der Exception habe ich eigentlich nichts gefunden, was auf meine Umgebungskonstellation passt. Das scheint so niemand zu machen (oder niemand hat Probleme damit), das Zertifikat aus einem KeyVault zu holen.

P.S.:
mein "temporärer fix" war


if (string.IsNullOrEmpty(certString) || true)

... nur der Vollständigkeit halber, damit der Kommentar im Code nicht "sinnlos" dasteht 😃

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Papst,

  
X509Certificate2 cert = new X509Certificate2(certBytes, string.Empty, X509KeyStorageFlags.MachineKeySet|X509KeyStorageFlags.Exportable|X509KeyStorageFlags.UserKeySet);  
  

Lass einmal das UserKeySet weg.
In einer geteilten Umgebung wie Azure könnte das womöglich der Grund fürs Scheitern sein, da es kein "richtiges" User-Profil gibt.
Probiere


X509Certificate2 cert = new X509Certificate2(certBytes, string.Empty, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

Kennst du Using Certificates in Azure Websites Applications? (über die Aktualität kann ich leider nichts sagen).

Sollte nichts helfen, so kannst du das Zertificat auch als Ressource (resx) zur Assembly einbinden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
Papst Themenstarter:in
441 Beiträge seit 2014
vor 6 Jahren

Manchmal ist es so einfach 😃 Danke.

Den Link kannte ich nicht, aktuell scheint es aber nicht zu sein - das ist noch das alte Azure Portal.
Ob das noch so funktioniert kann ich nicht sagen, ich wollte allerdings explizit den Weg über den Key Vault gehen.