Configuración de OpenSSL

Author
Por Darío Rivera
Publicado el en OpenSSL

Lo primero que debes hacer es crear un archivo preferiblemente en el OPENSSLDIR, pues es allí donde debería estar la configuración por defecto de openssl. Para saber cuál es el directorio por defecto de openssl puedes ejecutar el siguiente comando:

# openssl version -a | grep OPENSSLDIR
OPENSSLDIR: "/usr/lib/ssl"

Configuración para la creación de un CSR

El archivo que vas a crear podría llamarse custom_openssl.cnf. Una vez hecho esto debes definir cuáles son los campos que se preguntarán en la creación de un CSR (Certificate Signing Request). Podrías por ejemplo solictar que en la creación del CSR solamente se pida el país, entonces la mínima configuración que necesitarías sería la siguiente:

[ req ]
distinguished_name = req_distinguished_name

[ req_distinguished_name ]
countryName = Country Name (2 letter code)

Al crear un CSR junto con una llave privada a partir de este archivo  podríamos utilizar el siguiente comando:

sudo openssl req -new -keyout userkey.pem -out usercert-req.pem -config custom_openssl.cnf

Y obtendríamos una salida como la siguiente:

Generating a RSA private key
...........+++++
.............+++++
writing new private key to 'userkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:CO

Como puedes ver solamente se ha solicitado el país. Al crear el CSR puedes verificar la información a firmar en el Subject con el siguiente comando:

# openssl req -text -in usercert-req.pem  -noout | grep Subject:
Subject: C = CO

Ya que vimos un poco como funciona el proceso de creación de un CSR y los fields necesarios vamos a definir una configuración más completa acerca de qué debería llevar un CSR.

[ req_distinguished_name ]
countryName                    = Country Name (2 letter code)
countryName_default            = CO
countryName_min                = 2
countryName_max                = 2

stateOrProvinceName            = State or Province Name (full name)
localityName                   = Locality Name (eg, city)
organizationalUnitName         = Organizational Unit Name (eg, section)

commonName                     = Common Name (eg, YOUR name)
commonName_max                 = 64

emailAddress                   = Email Address
emailAddress_max               = 40

Al crear un CSR con esta configuración todos estos campos se solicitarán en consola.

-----
Country Name (2 letter code) [CO]:CO
State or Province Name (full name) []:Antioquia
Locality Name (eg, city) []:Medellin
Organizational Unit Name (eg, section) []:Tech
Common Name (eg, YOUR name) []:pleets.org
Email Address []:noreply@pleets.org

Resulta que algunos campos como el nombre de la organización pueden estar más de una vez en una misma solicitud. Es por esto que suele indicarse un número antes de este tipo de campos y te puedes encontrar con lo siguiente:

[ req_distinguished_name ]
0.OrganizationName             = Organization Name (eg, company)

Nota que hemos omitido todos los demás campos por simplicidad. Si quiesieras agregar otro nombre de organización podrías fácilmente hacer lo siguiente:

[ req_distinguished_name ]
0.organizationName             = Organization Name 1 (eg, company)
1.organizationName             = Organization Name 2 (eg, company)

Usualmente no es necesario agregar más de una organización. Si intentas crear un CSR con esta configuración verás algo como los siguiente:

-----
Country Name (2 letter code) [CO]:CO
State or Province Name (full name) []:Antioquia
Locality Name (eg, city) []:Medellin
Organization Name 1 (eg, company) []:Alphabet
Organization Name 2 (eg, company) []:Google
Organizational Unit Name (eg, section) []:Technology
Common Name (eg, YOUR name) []:google.com
Email Address []:noreply@google.com

Configuración para firmar un Certificado

Para firmar un certificado debemos crear algunos archivos de configuración de openssl.

sudo mkdir ca_company
sudo touch ca_company/database.txt
sudo touch ca_company/database.txt.attr
sudo echo "C001" > ca_company/serial.txt
sudo mkdir ca_company/newcerts

El archivo database.txt contendrá la base de datos de todos los certificados creados. El archivo serial.txt guardará el último consecutivo generado para un certificado y la carpeta newcerts guardará los nuevos certificados generados.

El siguiente paso es crear un certificado con el que firmaremos los demás certificados (certificado autofirmado)

sudo openssl req -new -x509 -keyout ca_company/cakey.pem -out ca_company/cacert.pem -days 3650

Finalmente debemos agregar lo siguiente a la configuración del archivo openssl a utilizar.

[ ca ]
default_ca = ca_company

[ ca_company ]
dir             =./ca_company
new_certs_dir   = $dir/newcerts
database        = $dir/database.txt
certificate     = $dir/cacert.pem
private_key     = $dir/cakey.pem
serial          = $dir/serial.txt
default_md      = sha256
policy          = policy_match
default_days    = 365

[ policy_match ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

Para firmar podemos utilizar el siguiente comando:

sudo openssl ca -in usercert.pem -out output.cert -config openssl.cnf

Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.