Para firmar certificados de clientes, necesitará un certificado de CA que controle. En la mayoría de los casos, pagar por uno es imposible, ya que los certificados de CA de confianza global son un peligro para la seguridad del resto de Internet. Por lo tanto, en estos casos, debe crear su propia CA y crear sus propios certificados de servidor y cliente.
Comencemos con un archivo básico openssl.conf que usaremos para la generación de todos estos certificados:
[ 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 ]
Este archivo de configuración se crea para la generación automática de certificados a partir de un script por lotes. Si necesita más opciones de control o nombre, debe adaptarlo a su situación.
Entonces, para generar una CA, vaya al directorio donde desea hacer su CA, coloque openssl.conf allí y:
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
Ahora, para generar un certificado de servidor (por ejemplo, para su servidor 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
Ahora para generar un certificado cliente :
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
La única diferencia entre generar claves y certificados para clientes y servidores es evitar que un certificado de cliente robado también se pueda usar para jugar a un servidor y engañar a otros clientes para que se conecten a él (esto solo funciona mientras sus aplicaciones admite la extensión de cliente y servidor en certificados).