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.