it-swarm.dev

aiutare a comprendere la verifica del certificato del cliente

Sto creando un'API a cui solo determinati computer dovrebbero avere accesso. La comunicazione avverrà tramite SSL tra il server e i client. Per verificare che un client abbia accesso, vorrei creare un certificato per ciascun client, che è firmato dal server. A tutti i client che non forniscono il certificato firmato dal server, dovrebbe essere negato l'accesso.

Ho un certificato SSL e una chiave da GoDaddy. Ho pensato che avrei dovuto essere in grado di creare certificati client usando queste informazioni, ma ovunque guardi, mi sembra di aver bisogno del certificato CA (da GoDaddy) per firmare il certificato client e non il certificato/chiave del mio server specifico.

Questo non ha senso per me, perché sembra strano che dovrei andare su GoDaddy e ottenere un nuovo certificato per ogni cliente. Immagino che non sia così e che stia facendo qualcosa di sbagliato o non capisca completamente.

Quindi - Come posso creare un certificato client che è firmato dal mio certificato server/password?

Se potessi fornire comandi (sto usando openssl) per generare il certificato client dal mio certificato del server, sarebbe anche molto apprezzato.

Grazie!

20
zsalzbank

Per firmare i certificati client, è necessario un certificato CA che controlli. Pagare per uno è fuori discussione nella maggior parte dei casi, poiché i certificati CA di fiducia globale rappresentano un rischio per la sicurezza del resto di Internet. Quindi in questi casi devi creare la tua CA e creare i tuoi certificati server e client.

Quindi iniziamo con un file openssl.conf di base che useremo per la generazione di tutti questi certificati:

[ ca ]
default_ca  = CA_default                # The default ca section

[ CA_default ]
certs          = certs                  # Where the issued certs are kept
crl_dir        = crl                    # Where the issued crl are kept
database       = database.txt           # database index file.
new_certs_dir  = certs                  # default place for new certs.
certificate    = cacert.pem             # The CA certificate
serial         = serial.txt             # The current serial number
crl            = crl.pem                # The current CRL
private_key    = private\cakey.pem      # The private key
RANDFILE       = private\private.rnd    # private random number file

x509_extensions  = v3_usr               # The extentions to add to the cert
default_days     = 365
default_crl_days = 30                   # how long before next CRL
default_md       = sha256               # which md to use.
preserve         = no                   # keep passed DN ordering
policy           = policy_match
email_in_dn      = 

[ policy_match ]
commonName      = supplied

[ req ]
default_bits        = 2048
default_keyfile     = privkey.pem
distinguished_name  = req_distinguished_name
x509_extensions     = v3_ca

[ v3_ca ]
basicConstraints     = CA:TRUE
subjectKeyIdentifier = hash

[ v3_usr ]
basicConstraints     = CA:FALSE
subjectKeyIdentifier = hash

[ server ]
basicConstraints       = CA:FALSE
nsCertType             = server
nsComment              = "Server Certificate"
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer:always
extendedKeyUsage       = serverAuth
keyUsage               = digitalSignature, keyEncipherment

[ client ]
basicConstraints       = CA:FALSE
nsCertType             = client
nsComment              = "Client Certificate"
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer:always
extendedKeyUsage       = clientAuth
keyUsage               = digitalSignature

[ req_distinguished_name ]

Questo file di configurazione è creato per la generazione automatica di certificati da uno script batch. Se hai bisogno di più controllo o opzioni di denominazione, devi adattarlo alla tua situazione.

Quindi per generare una CA, vai alla directory in cui vuoi creare la tua CA, inserisci openssl.conf e:

PASSWORD="PUT_YOUR_CA_PASSWORD_HERE"

# Make the config CA specific
cat openssl.conf > use.conf
echo "CN=PUT_CA_NAME_HERE" >> use.conf

# Create the necessary files
mkdir keys requests certs 
touch database.txt
echo 01 > serial.txt

# Generate your CA key (Use appropriate bit size here for your situation)
openssl genrsa -aes256 -out keys/ca.key -passout pass:$PASSWORD 2048

# Generate your CA req
openssl req -config use.conf -new -key keys/ca.key -out requests/ca.req -passin pass:$PASSWORD

# Make your self-signed CA certificate
openssl ca  -config use.conf -selfsign -keyfile keys/ca.key -out certs/ca.crt -in requests/ca.req -extensions v3_ca -passin pass:$PASSWORD -batch

# Cleanup
rm requests/ca.req use.conf

Ora per generare un certificato server (ad es. Per il tuo server web):

PASSWORD="PUT_YOUR_CA_PASSWORD_HERE"
NAME="PUT_THE_NAME_OF_SERVER_TO_GENERATE_HERE"

# Make the config Server specific
cat openssl.conf > use.conf
echo "CN=$NAME" >> use.conf

openssl req -new -nodes -extensions server -out "requests/$NAME.req" -keyout "$NAME.key" -config use.conf -passin pass:$PASSWORD )
openssl ca -batch -extensions server -keyfile keys/ca.key -cert certs/ca.crt -config use.conf -out "certs/$NAME.crt" -passin pass:$PASSWORD -infiles "requests/$NAME.req"

# Cleanup
rm "requests/$NAME.req" use.conf

Ora per generare un certificato client:

PASSWORD="PUT_YOUR_CA_PASSWORD_HERE"
NAME="PUT_THE_NAME_OF_CLIENT_TO_GENERATE_HERE"

# Make the config Client specific
cat openssl.conf > use.conf
echo "CN=$NAME" >> use.conf

openssl req -new -nodes -extensions client -out "requests/$NAME.req" -keyout "$NAME.key" -config use.conf -passin pass:$PASSWORD )
openssl ca -batch -extensions client -keyfile keys/ca.key -cert certs/ca.crt -config use.conf -out "certs/$NAME.crt" -passin pass:$PASSWORD -infiles "requests/$NAME.req"

# Cleanup
rm "requests/$NAME.req" use.conf

L'unica differenza tra la generazione di chiavi e certificati per client e server è impedire che un certificato client rubato possa essere utilizzato anche per riprodurre un server e "ingannare" altri client per connettersi ad esso (questo funziona solo fino a quando le applicazioni supportano il client e l'estensione del server nei certificati).

19
Paul

Un'autorità di certificazione è un'entità che emette certificati. Vuoi rilasciare certificati (ai client), quindi vuoi essere una CA.

Chiunque tenti di convalidare un certificato deve fidarsi della chiave CA (ovvero a priori fiducia: pensa alla chiave pubblica della CA codificata nel software o nel sistema operativo). Nel tuo caso, vuoi che il tuo server convalidi i certificati, quindi il tuo server dovrà conservare una copia della chiave pubblica della CA.

Le CA esistenti come GoDaddy sono riuscite a ottenere una copia della loro chiave pubblica in tutti i browser Web: le loro CA sono considerate affidabili da Everyone. Per raggiungere questo obiettivo, hanno dovuto dimostrare ai fornitori di browser (ad esempio Microsoft) di essere affidabili e seri (la chiave privata è in un bunker, hanno procedure per tutto, hanno un backup finanziario sufficiente per garantire la continuità delle operazioni ...) ed era costoso, motivo per cui non ti forniranno energia sub-CA gratuitamente (o anche a basso costo). Tuttavia, nella tua situazione, non ti importa se la chiave CA è conosciuta da tutto il mondo: hai solo bisogno di una CA di cui il tuo server (che controlli interamente) si fiderà. Una CA che ti manterrai andrà bene.

EJBCA è un'implementazione di CA open source gratuita che dovrebbe essere facile da usare. In alternativa, puoi mettere insieme alcuni script OpenSSL .

Nota: i certificati sono per autenticazione, non per autorizzazione. Hanno lo scopo di identificare gli utenti. Ti suggerisco di separare i due ruoli nel tuo server:

  • Quando si emette un certificato al client X, inserire il nome "X" nel certificato.
  • Conservare sul server una tabella di "client consentiti" (per nome).
  • Quando un client si connette, convalida il suo certificato, quindi estrai il nome del client dal certificato e controlla il nome nella tabella dei client consentiti.

Questa separazione sarà estremamente utile il giorno in cui si desidera revocare i diritti di accesso di un determinato client.

10
Thomas Pornin

Per quanto ne so, non è possibile creare un certificato client valido con SSL acquistato da GoDaddy. Il motivo alla base ha a che fare con la chiave privata del certificato CA di GoDaddy, che non forniranno per una buona ragione.

Ora, se hai tutti i computer sotto il tuo controllo la cosa più semplice ed economica, la cosa da fare sarebbe generare il tuo certificato CA e firmare i tuoi clienti. Aggiungi la tua CA a ciascun archivio radice attendibile su ogni singolo computer.

Puoi ottenere una CA per firmare un certificato che ti consente di essere una CA, tuttavia, questi certificati non sono economici, come in "contattaci per un preventivo".

Se hai bisogno di uno strumento credo XCA è una GUI che ti renderà più semplice.

1
Travis Pessetto