2016-06-03 15 views
6

Ho un codice per autenticarsi con Azure Key Vault per recuperare alcuni segreti. Sono un'autenticazione che utilizza un ID client e un certificato invece di un ID client e segreto. Questo codice funziona alla grande in una normale console app:Installare un certificato per un cluster locale

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
try 
{ 
    store.Open(OpenFlags.ReadOnly); 

    var matchingCertificates = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false); 
    if (matchingCertificates.Count != 1) 
    { 
     return null; 
    } 

    return matchingCertificates[0]; 
} 
finally 
{ 
    if (store != null) store.Close(); 
} 

Appena provo utilizzando questo codice in un'applicazione di servizio informazioni sullo stato non è più in grado di trovare il certificato.

Come posso installare un certificato in modo che sia disponibile per il mio cluster locale?

risposta

2

Le applicazioni di Service Fabric vengono eseguite con l'account SERVIZIO DI RETE, quindi è necessario assicurarsi che l'account abbia accesso/autorizzazioni al certificato.

EDIT:

Per un cluster in esecuzione sulla propria macchina locale, lo si fa trovando il certificato sia utilizzando certmgr.msc o MMC relativo snap-in e quindi fare clic destro> Tutte le attività> Gestisci chiavi private e poi dando permessi di lettura al SERVIZIO DI RETE.

Per i cluster remoti in Azure, è possibile farlo utilizzando un custom script extension sui VM del set di scalabilità che eseguirà uno script PowerShell che imposta le autorizzazioni desiderate. Ad esempio, si potrebbe fare qualcosa di simile al seguente:

$certificate = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Thumbprint -eq $certificateThumbprint} 

# Get file path 
$certificateFilePath = "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\" + $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName 

# Take ownership of the file so that permissions can be set 
takeown /F $certificateFilePath 

# Give the NETWORK SERVICE read permissions 
$acl = (Get-Item $certificateFilePath).GetAccessControl('Access') 
$rule = new-object System.Security.AccessControl.FileSystemAccessRule "NETWORK SERVICE","Read","Allow" 
$acl.SetAccessRule($rule) 
Set-Acl -Path $certificateFilePath -AclObject $acl 
+0

Così sarà ancora vedere tutti i certificati che sono installati sulla mia macchina locale, fintanto che ha accesso a loro? – Dismissile

+0

Sì, è vero. Anziché fornire l'accesso manualmente, è possibile fare in modo che Service Fabric dia automaticamente accesso a determinati certificati definendo utenti, gruppi e criteri di accesso in ApplicationManifest.xml. Vedere questo documento per maggiori informazioni su come impostare questo: https://azure.microsoft.com/en-us/documentation/articles/service-fabric-application-runas-security/#a-complete-application-manifest-example –

+0

Can fornisci maggiori dettagli su come concedi l'accesso al certificato in Service Fabric? Quel documento parla di certificati endpoint SSL ma non è il mio caso d'uso. Sto utilizzando una chiave privata del certificato per l'autenticazione con una risorsa KeyVault. – Dismissile

6

La ragione per cui questo non funziona così com'è è perché Servizio tessuto eseguito con l'account SERVIZIO DI RETE, che, senza la configurazione, non ha accesso alla certificato.

Per noi almeno, questo scenario ha causato un'eccezione "Keyset inesistente" quando si utilizza il KeyVaultClient fornito da Microsoft.Azure.KeyVault per connettersi a Key Vault utilizzando il certificato.

Una soluzione a questo è includere il certificato nel proprio ApplicationManifest.xml, che indica a Service Fabric di fornire l'accesso al certificato al SERVIZIO DI RETE.

<ApplicationManifest> 
    <!-- snip --> 
    <Principals> 
     <Users> 
     <User Name="NetworkServiceAccount" AccountType="NetworkService" /> 
     </Users> 
    </Principals> 
    <Policies> 
     <SecurityAccessPolicies> 
     <SecurityAccessPolicy ResourceRef="KeyVaultCert" PrincipalRef="NetworkServiceAccount" GrantRights="Full" ResourceType="Certificate" /> 
     </SecurityAccessPolicies> 
    </Policies> 
    <Certificates> 
     <SecretsCertificate X509FindValue="1ABCD86B815F37123459A34C1BA9EDEBABCEDF1" Name="KeyVaultCert" /> 
    </Certificates> 
</ApplicationManifest> 

... dove sia NetworkServiceAccount e KeyVaultCert sono nomi arbitrari utilizzati dall'elemento <SecurityAccessPolicy /> per fare riferimento l'utente e certificato.

Vedi anche https://azure.microsoft.com/en-us/documentation/articles/service-fabric-application-runas-security/#a-complete-application-manifest-example

+0

Questa è la risposta migliore, più pulita e più facile. Funziona impeccabile! – rfcdejong

+0

Sembra che il rollover di un certificato non sia supportato da questa soluzione.Azure Service Fabric non annulla la registrazione della porta con qualcosa come "netsh http ssl remove .." e l'aggiornamento di un'applicazione con una nuova identificazione non riesce ... – rfcdejong

Problemi correlati