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).