2017-01-09 6 views
0

Ich versuche, ein selbstsigniertes Zertifikat auf meiner Azure-Website zu installieren und es dann für den Zugriff auf Azure Key Vault zu verwenden.
Wenn ich den Code lokal ausführen und das Zertifikat von StoreLocation.CurrentUser lesen & StoreName.My alles funktioniert wie erwartet.
Es wurde versucht, denselben Code in meiner bereitgestellten Site in Azure auszuführen, aber es schlägt fehl.
Wenn ich den Lesevorgang ändern, um StoreLocation.LocalMachine zu verwenden, wird das Zertifikat ohne den privaten Schlüssel geladen, der später eine Ausnahme verursacht: "System.NotSupportedException: Der private Schlüssel ist nicht im X.509-Zertifikat vorhanden".
Muss ich das Zertifikat anders laden? oder vielleicht habe ich es in Azure überhaupt nicht richtig installiert?
Dies sind die Installationsschritte i nahm:
1. Gehen Sie zu https://ms.portal.azure.com
2. meine Ressource wählen (meiner Website App Service)
3. Klicken Sie auf "SSL-Zertifikate"
4. Klicken Sie auf "Upload-Zertifikat"
5. klicken Sie auf Durchsuchen, wählen Sie meine pfx Datei und geben Sie das Passwort
6. klicken Sie auf „Upload“

Dies ist der Code, den ich mit dem Zertifikat zu lesen und verwenden:Installation und Verwendung des Zertifikats auf der Azure-Website

// C-tor 
    public SecretRetriever(string thumbprint, string clientId) 
    { 
     var clientAssertionCertPfx = FindCertificateByThumbprint(thumbprint); 
     this.AssertionCert = new ClientAssertionCertificate(clientId, clientAssertionCertPfx); 
    } 

    /// <summary> 
    /// Get the certificate associated with the given secretId 
    /// </summary> 
    /// <param name="secretId"></param> 
    /// <returns></returns> 
    public async Task<string> GetSecretAsync(string secretId) 
    { 
     var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessTokenAsync)); 
     return (await kv.GetSecretAsync(secretId)).Value; 
    } 

    private async Task<string> GetAccessTokenAsync(string authority, string resource, string scope) 
    { 
     var context = new AuthenticationContext(authority, TokenCache.DefaultShared); 
     var result = await context.AcquireTokenAsync(resource, AssertionCert); 
     return result.AccessToken; 
    } 

    //when changing to "CurrentUser" the private key is in the certificate. why it is not there when reading from LocalMachine? 
    private static X509Certificate2 FindCertificateByThumbprint(string findValue) 
    { 
     X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     try 
     { 
      store.Open(OpenFlags.ReadOnly); 
      X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindByThumbprint, findValue, false); 
      if (col.Count == 0) 
      { 
       return null; 
      } 
      return col[0]; 
     } 
     finally 
     { 
      store.Close(); 
     } 
    } 
+0

Das Problem ist, dass Ihre Webanwendung unter unpriveleged Konto auf Azure ausgeführt wird und volle Kontrolle nur über 'CurrentUser'-Speicher und Sie haben nur Leseberechtigungen auf' LocalMachine' Store. Außerdem haben Sie keinen Zugriff auf Schlüssel, die im 'LocalMachine' Store gespeichert sind. Dies bedeutet, dass Sie Ihr persönliches Zertifikat im 'CurrentUser' Store installieren müssen. SSL geht zu 'LocalMachine'. – Crypt32

+0

Nach dem Erteilen von Zugriff über die Anwendungseinstellungen funktioniert es. Danke! –

Antwort

1

Um dieses Problem zu lösen, musste ich meiner Website die Erlaubnis erteilen, auf das Zertifikat zuzugreifen.
Dies, indem Sie auf die App in Azure-Portal erreicht wurde -> Einstellungen -> Anwendungseinstellungen
I addierten die folgenden App Einstellung:
Key: WEBSITE_LOAD_CERTIFICATES, Wert: My_Certificate_Thumbprint
(Danke für mich in der rechten Zeige Richtung, Crypt32)

Verwandte Themen