Chiave privata remota per l'autorità di certificazione

1

Sfondo

Mi sono preso gioco dell'idea di utilizzare una chiave privata protetta racchiusa da un'API, come Azure KeyVault o chiavi Amazon KMS per firmare i certificati per l'infrastruttura a chiave privata interna.

Concettualmente, questo è simile all'utilizzo di OpenSSH Agent per firmare le richieste di connessione per SSH. La chiave non viene mai esposta all'applicazione che ha preparato la richiesta.

Il mio interesse è principalmente accademico. Gestisco frequentemente le chiavi RSA per lavoro e mi piace solo sbirciare sotto le copertine di come funziona. Ma se riesco a trovare qualcosa che sia effettivamente pronto per la produzione, potrei usarlo per il mio lavoro quotidiano con le distribuzioni Web.

Opzioni che ho esaminato

Azure KeyVault fornisce un'interfaccia per la creazione di certificati autofirmati, ma se voglio utilizzare i certificati come certificati client con MongoDB (ad esempio), sarebbe utile avere un certificato da utilizzare come root.

Ho esaminato una serie di opzioni per raggiungere questo obiettivo. Quello che sembrava più promettente è scrivere un provider PKCS11 personalizzato per fungere da intermediario per la chiave impacchettata dell'API. Forse usando libcurl o qualcosa di simile per fare la chiamata API. Non sono così competente come programmatore C / C ++, quindi questa non sarebbe una soluzione molto pratica per me ... anche se potrei essere interessato a perseguirlo per l'esperienza di apprendimento.

Potrei usare una soluzione di terze parti come Hikicorp Vault PKI o Certificati di CredHub . Hashicorp Vault dispone di un provider di archiviazione per mantenere la chiave risultante in Azure KeyVault. Ma dalla documentazione, sembra che entrambi i servizi lasciano la chiave privata esposta a se stessi.

Ho esaminato pyOpenSSL come livello superiore astrazione per firmare un CSR, ma l'API accetta una chiave privata come parametro.

Vantaggi della soluzione

Per me, i benefici percepiti dall'utilizzo di tale soluzione sono che la chiave privata non è mai accessibile (nemmeno a me). Pertanto, un'esposizione dell'accesso alla chiave della CA principale è limitata a tutti i certificati che un utente malintenzionato riesce a emettere mentre ha accesso.

Poiché l'accesso alla chiave ha un registro di controllo, semplificherebbe il monitoraggio del suo utilizzo e l'identificazione di accessi non autorizzati.

The Actual Question

Sto cercando di trovare o sviluppare una soluzione in cui la firma digitale viene elaborata da una terza parte, ma la logica di costruzione del contenuto da firmare viene gestita localmente, preferibilmente da soluzioni standard note come OpenSSL (come libreria o CLI) .

Esiste una soluzione per l'elaborazione di un CSR x509 in un certificato x509 in cui la chiave privata e gli algoritmi di firma sono racchiusi in un'API Web?

In caso contrario, c'è qualche buona documentazione da qualche parte per usare le librerie esistenti per convertire un CSR in un Certificato a basso livello? Post di blog benvenuti.

    
posta nbering 17.03.2018 - 22:59
fonte

1 risposta

2

Molte API crittografiche supportano i moduli di sicurezza hardware collegati in rete (HSM) e l'utilizzo di tali API sembra già essere conforme al tuo costrutto teorico.

.NET Core ha un CertificateRequest classe. Se crei una classe personalizzata che estenda RSA per comunicare con KeyVault (o usi una esistente ), puoi creare certificati dove la chiave di firma risiede in KeyVault.

X509SignatureGenerator generator = 
    X509SignatureGenerator.CreateForRSA(keyVaultRsa, RSASignaturePadding.Pkcs1);

X509Certificate2 cert =
    request.Create(issuerCert.SubjectName, generator, notBefore, notAfter, serialNumber);

Può scrivere CSR, ma non leggerli. Quindi questa è solo una risposta parziale, a meno che tu non abbia effettivamente bisogno di CSR nel tuo scenario.

    
risposta data 18.03.2018 - 04:55
fonte

Leggi altre domande sui tag