aiuto nella comprensione della verifica del certificato client

16

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 ogni cliente, 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 dovrei essere in grado di creare certificati client utilizzando queste informazioni, ma ovunque guardi, sembra che ho 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 questo non sia il caso e che sto facendo qualcosa di sbagliato, o non capisco completamente.

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

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

Grazie!

    
posta zsalzbank 17.12.2012 - 17:51
fonte

3 risposte

17

Per firmare i certificati client, è necessario un certificato CA che controlli. Pagare per uno è fuori questione nella maggior parte dei casi, poiché i certificati CA di fiducia globale rappresentano un rischio per la sicurezza per il 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 di base openssl.conf che useremo per generare 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 è stato 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 nella directory in cui vuoi creare la tua CA, metti openssl.conf lì 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 esempio 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 impedisce che un certificato client rubato possa essere utilizzato anche per riprodurre un server e "ingannare" altri client per connettersi ad esso (funziona solo fino a quando le tue applicazioni supporta l'estensione client e server nei certificati).

    
risposta data 18.12.2012 - 12:05
fonte
10

Un'autorità di certificazione è un'entità che emette certificati. Si desidera emettere certificati (per i client), quindi si desidera essere una CA.

Chiunque tenti di convalidare un certificato deve avere fiducia nella chiave CA (cioè nella fiducia a priori ): pensa che la chiave pubblica della CA sia codificata nel software o nel sistema operativo). Nel tuo caso, vuoi che il tuo server convalidi i certificati, così 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 di tutti . Per raggiungere questo obiettivo, hanno dovuto dimostrare ai venditori di browser (ad esempio Microsoft) che erano 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, ed è per questo che non ti daranno l'alimentazione in sub-CA gratuitamente (o anche a basso costo). Tuttavia, nella tua situazione, non ti importa se la chiave della CA è conosciuta da tutto il mondo: hai solo bisogno di una CA che il tuo server (che controlli interamente) avrà fiducia. Una CA che ti mantieni andrà bene.

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

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

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

Questa separazione sarà estremamente utile il giorno in cui desideri revocare i diritti di accesso di un determinato cliente.

    
risposta data 27.12.2012 - 22:10
fonte
1

Per quanto ne so non puoi creare un certificato client valido con il tuo SSL che hai acquistato da GoDaddy. Il motivo dietro a questo ha a che fare con la chiave privata del certificato CA di GoDaddy, che non saranno distribuiti per una buona ragione.

Ora, se hai tutti i computer sotto il tuo controllo, la cosa più semplice e più economica da fare sarebbe generare il tuo certificato CA e firmare i tuoi clienti. Aggiungi la tua CA a ciascuno degli archivi di Trusted Root su ogni singolo computer.

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

Se hai bisogno di uno strumento, credo che XCA sia una GUI che ti renderà più facile.

    
risposta data 17.12.2012 - 18:32
fonte

Leggi altre domande sui tag