GNU/Linux >> Tutoriales Linux >  >> Linux

Autoridad de certificación con OpenSSL

Este artículo le mostrará cómo configurar una autoridad de certificación con OpenSSL. Los certificados digitales son documentos utilizados para demostrar la propiedad de una clave pública. Por ejemplo, se utiliza un certificado digital para autenticar un sitio web al que se accede a través de HTPS. Otro ejemplo de un uso común es la firma de documentos.

Los certificados incluyen información sobre la clave, la identidad de su titular y la firma digital de una entidad que ha verificado el contenido. Una autoridad de certificación (CA) es la organización que emite certificados digitales.

Además, este artículo mostrará cómo decirle a otros hosts que confíen en los certificados emitidos.

Advertencia :esto debe ser solo con fines de prueba o prueba de concepto. Para usos de la vida real, debe adquirir certificados reales de una autoridad certificadora real. Por ejemplo, si solo quiere HTTPS y quiere el certificado gratis, vaya a https://letsencrypt.org/

Instalar OpenSSL

Mi sistema operativo principal es FreeBSD, y me gusta usar el árbol de puertos, para instalarlo simplemente ejecute:

# cd /usr/ports/security/openssl
# make install clean

Y espere hasta que la compilación y la instalación del puerto estén listas. Preste atención a que probablemente ya tenga un ejecutable de openssl (en la ruta /usr/bin) y si lo instala de todos modos, el binario 'puerto' estará en /usr/local /bin/openssl.

La primera vez que traté con OpenSSL, el binario provisto no funcionó para mí, pero el puerto sí.

Archivo de configuración

Aunque mi sistema operativo principal es FreeBSD, de ahora en adelante, se deben seguir los mismos pasos en cualquier sistema operativo compatible con OpenSSL. Tal vez necesite ajustar algunas rutas, pero eso es todo.

Encontrará (nuevamente, en FreeBSD) un archivo de configuración de ejemplo y bien comentado en /usr/local/openssl/openssl.conf. Este es el mío después de una limpieza, he resaltado las configuraciones más importantes:

#OpenSSL Home current directory
HOME                    = /var/openssl #choose any reasonable location
#RANDFILE                = $ENV::HOME/.rnd

# Extra OBJECT IDENTIFIER info:
oid_section             = new_oids

[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7

[ ca ]
default_ca      = YourCA              # The default Certificate Authority section

[ YourCA ] #most important section of your file
dir             = /var/openssl/yourCA           # Where everything is kept
                                                              # choose any reasonable location
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
new_certs_dir   = $dir/newcerts         # default place for new certs.
certificate     = $dir/CA/yourCA.crt  # The CA certificate
serial          = $dir/serial           # The current serial number
#crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/CA/yourCA.crl  # The current CRL
private_key     = $dir/CA/yourCA.key  # The private key
RANDFILE        = $dir/private/.rand    # private random number file
x509_extensions = usr_cert              # The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = default               # use public key default MD
preserve        = no                    # keep passed DN ordering
policy          = policy_match

# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = supplied
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
localityName            = supplied

# For the 'anything' policy. At this point in time, you must list all 
# acceptable 'object' types.
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

############################################################
[ req ]
default_bits            = 2048
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
attributes              = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
string_mask = utf8only

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = AR #I'm on ARgentina
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Salta # i.e. the province I live on

localityName                    = Locality Name (eg, city)

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Your company name

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Section Name. # eg. IT
commonName                      = Common Name (e.g. server FQDN or YOUR name)
commonName_max                  = 64

emailAddress                    = Email Address
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = A challenge password
challengePassword_min           = 4
challengePassword_max           = 20
unstructuredName                = An optional company name

[ usr_cert ]
basicConstraints=CA:FALSE
nsComment                       = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true

[ crl_ext ]
authorityKeyIdentifier=keyid:always

[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment                       = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
# This really needs to be in place for it to be a proxy certificate.
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo

[ tsa ]
default_tsa = tsa_config1       # the default TSA section

[ tsa_config1 ]
# These are used by the TSA reply generation only.
dir             = ./demoCA              # TSA root directory
serial          = $dir/tsaserial        # The current serial number (mandatory)
crypto_device   = builtin               # OpenSSL engine to use for signing
signer_cert     = $dir/tsacert.pem      # The TSA signing certificate
                                        # (optional)
certs           = $dir/cacert.pem       # Certificate chain to include in reply
                                        # (optional)
signer_key      = $dir/private/tsakey.pem # The TSA private key (optional)
default_policy  = tsa_policy1           # Policy if request did not specify it
                                        # (optional)
other_policies  = tsa_policy2, tsa_policy3      # acceptable policies (optional)
digests         = md5, sha1             # Acceptable message digests (mandatory)
accuracy        = secs:1, millisecs:500, microsecs:100  # (optional)
clock_precision_digits  = 0     # number of digits after dot. (optional)
ordering                = yes   # Is ordering defined for timestamps?
                                # (optional, default: no)
tsa_name                = yes   # Must the TSA name be included in the reply?
                                # (optional, default: no)
ess_cert_id_chain       = no    # Must the ESS cert id chain be included?
                                # (optional, default: no)

Glosario

Antes de continuar, un pequeño glosario de las siglas utilizadas en el archivo:

  • CA:significa autoridad certificadora
  • CRL:significa Listas de revocación de certificados
  • CSR:significa Solicitud de firma de certificado
  • MD:significa Message Digest
  • TSA:significa Autoridad de Sellado de Tiempo

Repositorio de certificados

A continuación, crea los directorios y los archivos (por ahora vacíos) para almacenar nuestras claves y certificados:

# cd /var/openssl
# mkdir -p yourCA/CA
# mkdir -p yourCA/newcerts
# mkdir -p yourCA/certs/keys
# mkdir -p yourCA/certs/requests
# mkdir -p yourCA/certs/certificates
# cd yourCA
# touch index.txt
# echo 01 > serial

Certificado CA

Ahora puede crear su certificado de autoridad de certificación y firmarlo. Pero primero, necesitamos crear una clave privada con el siguiente comando:

# /usr/local/bin/openssl genrsa -out yourCA/CA/yourCA.key 2048

En segundo lugar, cree una CSR ejecutando:

# /usr/local/bin/openssl req -new -key ./yourCA/CA/yourCA.key -out yourCA/CA/yourCA.csr

Siga las instrucciones en pantalla, prestando atención para completar la información correcta. Finalmente, autofirma tu certificado:

# /usr/local/bin/openssl x509 -req -days 365 \
> -in yourCA/CA/yourCA.csr -out yourCA/CA/yourCA.crt \
> -signkey yourCA/CA/yourCA.key

Y esto es todo:ahora puede comenzar a firmar sus certificados de cliente o web

Certificados de clientes

El proceso es bastante similar al anterior. Pero estamos usando nuestro certificado CA para firmar el certificado del cliente. E, idealmente, el cliente generará su propia clave privada y la CSR.

De todos modos, solo estamos probando cosas, así que hago cada paso y luego distribuyo los certificados generados a mi usuario. Los siguientes comandos se pueden ejecutar en todas partes, pero solo para mantener el orden, estoy usando las carpetas creadas anteriormente (en /var/openssl/yourCA/certs ). Nuestro usuario, John Doe, primero necesita una clave privada:

# cd /var/openssl/yourCA/certs
# /usr/local/bin/openssl genrsa -des3 -out keys/johndoe.key 2048

No olvide la frase de contraseña, ya que se le preguntará varias veces; a continuación, cree la solicitud de firma del certificado:

# /usr/local/bin/openssl req -new -key keys/johndoe.key -out requests/johndoe.csr

A continuación, firme el certificado con este comando:

# /usr/local/bin/openssl ca -in requests/johndoe.csr -cert ../CA/yourCA.crt -keyfile ../CA/yourCA.key -out certificates/johndoe.crt

Finalmente, exporte el certificado al formato PKCS12, se le pedirá la contraseña de la PK:

# /usr/local/bin/openssl pkcs12 -export -clcerts -in certificates/johndoe.crt -inkey keys/johndoe.key -out certificates/johndoe.p12

Instalación del certificado

Ahora puede emitir sus propios certificados que su usuario necesita instalar para poder usarlo. Debes entregar dos archivos:yourCA.crt y el personal johndoe.p12.

Para instalarlo en Windows, utilice la herramienta Administrador de certificados. No subo varias capturas de pantalla porque, como mi ventana está en español, no me resultaría muy útil. Haga clic en el menú de inicio y ejecute "certmgr.msc", aparecerá la siguiente pantalla:

Haga clic con el botón derecho en la carpeta Autoridad de certificación raíz y elija "Importar". Comience con yourCA.crt y elija la autoridad de certificación raíz de la tienda, siga el asistente.

Ahora haga clic derecho en la carpeta Personal y repita el asistente con el archivo johndoe.p12. Se le pedirá la contraseña. Cuando finalice el asistente, podrá ver su certificado válido instalado y los detalles:

Recuerde, esto es solo para fines de aprendizaje. Pero esto también es una cuestión de confianza. Si su organización es lo suficientemente pequeña y hay confianza, debería poder trabajar con estos certificados de bricolaje.


Linux
  1. ¿Error al firmar Csr con la clave raíz Ca?

  2. ¿Cómo generar una solicitud de firma de certificado (CSR) con OpenSSL?

  3. Generar una solicitud de firma de certificado

  4. ¿Cómo compilar el archivo .c con OpenSSL incluye?

  5. Uso de openssl para obtener el certificado de un servidor

Cree su propia autoridad de certificación (CA) en CentOS/RHEL

Cómo generar certificados SSL autofirmados usando OpenSSL

Reemplace un certificado SHA-1 con un certificado SHA-2 en Plesk

Proteja Nginx con el certificado Let's Encrypt SSL en Ubuntu 18.04

Cómo proteger Nginx con el certificado SSL de Let's Encrypt

¿Cómo generar un certificado de openssl con vencimiento inferior a un día?